2015-12-15 36 views
2

这里是我的示例代码的JavaScript protyping - 差异

function Person(name, age) { 
    this.name = name; 
    this.age = age; 
} 

Person.prototype = { 
    constructor: Person, 
    printInformation: function() { 
    console.log(this.toString()); 
    }, 
    toString: function() { 
    return "Name: " + this.name + ", Age: " + this.age; 
    } 
}; 

var person1 = new Person("Some Name", 15); 
person1.printInformation(); 
console.log(typeof(person1)); 
console.log(Object.getPrototypeOf(person1) === Object.prototype); 

var book = { 
    title: "Some book", 
    author: "Some author", 
    printInformation: function() { 
    console.log(this.toString()); 
    }, 
    toString: function() { 
    return "Book: " + this.title + ", Author(s): " + this.author; 
    } 
}; 

book.printInformation(); 
var bookPrototype = Object.getPrototypeOf(book); 
console.log(typeof(book)); 
console.log(Object.getPrototypeOf(book) === Object.prototype); 

输出:

Name: Some Name, Age: 15 
object 
false 
Book: Some book, Author(s): Some author 
object 
true 

为什么Object.getPrototypeOf(person1) === Object.prototype返回假,而Object.getPrototypeOf(book) === Object.prototype回是真的吗?

两者都是对象的实例,都指向原型,我希望它们都应该返回true。请赐教。

回答

3

person1的原型链是这样的:

person1 ---> Person.prototype ---> Object.prototype ---> null 

book的原型链是这样的:

book ---> Object.prototype ---> null 

Object.getPrototypeOf()方法的原型链返回下一个项目。因此,person1不返回Object.prototype,因此是false


为了让person1true,你必须循环调用,直到你达到Object.prototype

var obj = person1 

while (obj) { 
    if (obj === Object.prototype) { 
     console.log("found it!"); 
     break; 
    } 
    obj = Object.getPrototypeOf(obj); 
} 

或原型对象确实是一个功能,你可以只使用instanceof代替。

person1 instanceof Object; // true 
book instanceof Object; // true 

instanceof搜索您提供,看它是否有您所提供的功能,在这种情况下是Object功能的.prototype匹配任何对象的对象的原型链。

+0

感谢您的快速响应。第二部分呢。 “另外,开发人员在使用”函数“还是使用JSON格式创建类之间有优先选择吗?除了可读性之外,优点/缺点是什么?” –

+0

@KrishnanSriram:为了在一个对象上实现你自己的方法,你应该使用一个构造函数,这样你就不会扩展Object.prototype,除非你完全意识到分支。其他语法不一定是JSON语法。它是对象的字面语法,对于不需要增强的普通对象很有用,但是如果有一点点初始化操作,构造函数也可以用到。 – 2015-12-15 00:36:20

+1

@KrishnanSriram这是一个主要基于观点的问题,因此是堆栈溢出的主题,所以我从主要问题中删除了该部分。另外,一次只问一个问题,而不是多个问题。 – Oriol

0

使用您的Person原型,您明确定义为'Person'类型的对象,与book一样,它只是一个泛型对象,恰好有一个变量名称book

Object.getPrototypeOf(book)

控制台输出Object {}

Object.getPrototypeOf(person1)

控制台输出Person {}

Person是不一样的Object因而对于平等支票返回false。