2015-12-15 37 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。