[英]Prototype 1.7 Object.extend doesn't work as it should when used in prototype class
我正在嘗試在JavaScript中使用簡單的OOP模型,但是以某種方式失敗了。 我編寫了一個簡單的代碼來演示我的問題:
<html>
<head>
<title>Test</title>
<script src="scriptaculous/prototype.js"></script>
<script type="text/javascript">
var Person = Class.create({
options : {},
initialize: function(id, options) {
this.id = id;
Object.extend(this.options, options || {});
},
speak: function() {
console.log(this.options);
}
});
var person1 = new Person("abcd12",{
name : "Jon Doe",
age : 23
});
var person2 = new Person("cdef34",{
name : "Jane Doe",
age : 32
});
person1.speak();
//Object { name="Jane Doe", age=32}
person2.speak();
//Object { name="Jane Doe", age=32}
</script>
</head>
<body>
</body>
</html>
顯然,這根本不是我想要實現的,並且由於沒有Object.extend的適當文檔,因此我不知道這是正常的還是預期的。
謝謝您的幫助
“ options”屬性位於原型對象上,這意味着它被所有實例共享。 也就是說,當您在該表達式中提及this.options
時, 並不是將屬性直接放在新對象( this
)上,而是更新了原型中的現有屬性。
只要走那行:
options: {},
出來。
我想我將對Object.extend
的調用寫為:
this.options = Object.extend({}, options || {});
( 編輯 —實際上,現在我想到了,這是因為Object.extend
直接更新了傳入的第一個參數。如果您只是更改了對Object.extend
的調用,那么我認為它可以解決,盡管實際上沒有理由仍將其放在原型中。)
除非只是因為您的代碼段不完整,否則您實際上並沒有進行任何“對象擴展”,因此您可以這樣做:
var Person = Class.create({
initialize: function(id, options) {
this.id = id;
this.options = options;
},
...
});
這是一個如何使用Object.extend將傳入的options
屬性與默認屬性合並的示例:
var Person = Class.create({
initialize: function(id, options) {
this.id = id;
this.options = Object.extend({
prop1: 'defaultValue1',
bool1: true
}, options);
},
...
});
使用此代碼,如果您這樣做:
var person = new Person('idString', {prop1: 'custom prop 1'});
然后person.options
將產生:
{
prop1: 'custom prop 1',
bool1: true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.