原型模式最大的問題是由其共享的本性所導致的。
我們知道,原型中所有的成員是被很多例項共享的,這種共享對於函式非常合適。對於那些包含基本值的屬性倒也說得過去,畢竟可以通過在例項上新增乙個同名的屬性來隱藏原型中對應的屬性;
然而,對於包含引用型別值的屬性來說,問題就比較突出了。
來看下面的**:
function wede(){}
//重寫建構函式的原型物件,其中定義了乙個基本型別和乙個引用型別;
wede.prototype= //object
//例項化兩個物件
var person1=new wede();
var person2=new wede();
//修改乙個例項的基本型別值
person1.name="zhao wei";
//輸出兩個例項基本型別值
person1.name;
"zhao wei"
person2.name;
"wede.zhao"
可以看出,對例項person1基本型別的修改並沒有影響到例項person2;
其實這裡的本質是:為例項person1新增了乙個屬性name,以至於覆蓋了建構函式原型物件中的同名屬性;
而新增的person1.name屬性是屬於例項的,不屬於建構函式的原型物件;
所以在查詢屬性name的時候首先從例項中找到;
再看下面的例子:
//修改例項person1共享於建構函式原型物件中的引用型別friends;
//其實這裡還應該注意,與上面的修改基本型別不同的是,這裡不是為例項person1新增成員,而是修改它共享於原型物件的成員;
person1.friends.push("bosh");
//所以會導致下面的結果:
person1.friends;
["james", "wade", "bosh"]
person2.friends;
["james", "wade", "bosh"]
//而事實也證明,兩個例項成員指向的是同乙個引用:
person1.friends===person2.friends; //true
JS原型物件重寫問題
function person var friend new person 新建乙個person例項 重寫person的原型 person.prototype friend.sayname 返回結果是undefined var friend new person 重寫原型物件後新建person的例項...
JS 物件 JS原型 原型鏈
參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...
JS原型物件
原型prototype 將函式定義在全域性作用域中的缺點 1.會汙染全域性作用域的命名空間,如 函式functiona 那麼在全域性作用域中就不能再出現functiona這個命名了。2.定義在全域性作用域中不安全。因此,就用到了主角 原型 1.所有的函式都有原型物件 2.當函式以建構函式的形式呼叫時...