首先確定,實例不能訪問到原型對象中的屬性和方法,不僅僅是因爲重寫原型對象切斷了構造函數與最初原型之間的聯繫。在《 javascript中原型和對象》中我提到過實例可以訪問重寫的原型對象的屬性和方法的情況。
function Person(){
}
var person = new Person();
Person.prototype = {
//constructor : Person,
name : 'zxs',
age : 24,
sayName : function(){alert(this.name)}
}
person.sayName();
以上代碼在實例化對象時構造函數的原型爲空,它沒有任何除默認屬性以外的屬性。重寫構造函數的原型確實切斷了構造函數與最初原型之間的聯繫。
在使用 new 操作符以後構造函數的原型對象中的屬性和方法已經添加到 person對象中。因爲以上方法爲函數原型添加新屬性和方法不具有動態性,所以person不能訪問到新添加的屬性和方法。
重寫原型對象之後,就如同如下代碼:
var o = {
name : 'zxs'
}
var obj = o;
o = {}
console.log(o.name);
此時輸出的值是undefined,因爲,對象是一個引用類型,“=”是賦值操作符,並且其運算順序是從右往左。o={}就是說o的指向已經改變,是一個空對象。
Person.prototype.mothed = function() {}與Person.prototype={mothed:function(){}}的區別就如同 arr = []和arr.push()一樣,前者都是修改自身,後者是完全改變自身。