2016-08-05 80 views
1

我嘗試這個功能,看看不同的對象具有相互原有關係,所以我嘗試:如何讓Javascript「isPrototypeOf」函數返回true?

var o={name:'abc'}; 
var o2=o; 
console.log(o.isPrototypeOf(o2)); 
console.log(o2.isPrototypeOf(o)); 

那麼,它打印2個falses。我感到奇怪的是,「原型」是每個函數/對象的屬性/功能,所以JS如何判斷一個對象是否是另一個對象的原型?

我也試過:

var Person=function(){ 
    name='abc', 
    age=30 
}; 
var o1=new Person(); 
var o2=new Person(); 
console.log(o1.isPrototypeOf(o2)); 
console.log(o2.isPrototypeOf(o1)); 

再次,它打印2個falses,而我預計2個trues。

+1

無限。 'a'的'b'原型和'a'的原型,這不會發生。 – Tushar

+2

您只需將對象引用分配給變量。這與原型無關。要創建一個原型鏈,您需要使用'new'或'Object.create'。 – ftor

+0

請重新閱讀'isPrototypeOf'的文檔。通過讓一個對象實際上成爲另一個對象的原型,「使」isPrototypeOf'函數返回true「。 – 2016-08-05 10:22:08

回答

1

對於oo2的原型,o2對象需要從原型爲o的構造函數構造而成。換句話說,o2需要正確繼承o

僅爲一個變量分配一個對象或兩個對象相似是不夠的。一個對象必須從另一個繼承。

因此,在傳統意義上,這必須發生:

var o = {}; 
var OConstructor = function() {}; 
OConstructor.prototype = o; 

var o2 = new OConstructor(); 

o.isPrototypeOf(o2); // true 

在現代的代碼,您還可以使用繼承Object.create()

var o = {}; 

var o2 = Object.create(o); 

o.isPrototypeOf(o2); // true 
0

之後var o2=oo2指向o。所以oo2指向同一個對象。是o本身的原型?號是o2本身的原型?沒有了。

第二部分o1不是o2的原型。 嘗試致電

console.log(Person.prototype) 

你會看到實例Person的原型對象(它不是Person函數的原型)。

您也可以使用obj.__proto__來查看obj的原型。這是隱藏的財產。最好不要在生產中使用它。

+0

我添加了另一個代碼片段,請參閱上文,謝謝。 – Troskyvs