簡體   English   中英

javascript原型對象

[英]javascript prototype object

1。

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {protest:"maizere"};

[ myobject instanceof MyConstructor,     // false !
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //undefined

這證明myobject不再繼承MyConstructor原型的屬性和方法。

但是請參見下面的下一個代碼:

2。

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype.protest= "Maizere";//Do this line gets hoisted?or something else

[ myobject instanceof MyConstructor,     // true!
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //Maizere

為什么會發生這種情況?內部原型的確切定義是什么?即使在實例化對象后, proto仍在引用MyConstructor原型,這也證明了事實;如果這樣,為什么first(1。)代碼未引用MyConstructor原型呢? 由於該屬性是在第二個代碼中的對象實例化之后添加的,並且該對象的內部原型已接收到該屬性,因此這意味着我們可以稍后更改原型屬性,並仍然在實例中看到效果。但是相同的定義不起作用在第一個代碼中替換原型屬性時?

我對此可能是錯的,但是當您這樣做時:

MyConstructor.prototype = {protest:"maizere"};

您正在使用匿名對象定義覆蓋原型,因此,當您僅添加新屬性時,例如:

MyConstructor.prototype.protest= {"Maizere"};

您的課程保留其原型,並且像一個魅力一樣工作。

MyConstructor.prototype =覆蓋整個prototype對象。

instanceof運算符測試對象在其原型鏈中是否具有構造函數的prototype屬性

http://jsfiddle.net/ExplosionPIlls/xtqhp/

function MyConstructor () {}
MyConstructor.prototype = {'xyz': 'zyx'};
//true
console.log((new MyConstructor) instanceof MyConstructor);

function MyConstructor2 () {}
var mc2 = new MyConstructor2;
MyConstructor2.prototype = {'xyz': 'zyx'};
//false
console.log(mc2 instanceof MyConstructor2);

順便說一句, MyConstructor.prototype.protest = {"Maizere"}; 是無效的語法。

因此,這是我將本文添加為書簽的原因之一:

建設者被視為輕度混亂

基本上,第一段代碼中發生的事情是用新對象覆蓋MyConstructor的原型對象。 而在第二個塊中,您正在向現有原型對象添加一個屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM