Javascript 关于迭代使用resig'创建的实例的问题;s的简单js继承脚本
在过去的一周里,我一直在尽可能多地学习js继承,并遇到了john resig的简单js继承脚本。在测试代码时,一切都很顺利,直到我尝试迭代我的一个扩展对象。代码如下:Javascript 关于迭代使用resig'创建的实例的问题;s的简单js继承脚本,javascript,inheritance,iteration,Javascript,Inheritance,Iteration,在过去的一周里,我一直在尽可能多地学习js继承,并遇到了john resig的简单js继承脚本。在测试代码时,一切都很顺利,直到我尝试迭代我的一个扩展对象。代码如下: var Person = Class.create({ init : function(sex, devStage) { this.sex = sex; this.devStage = devStage || "newBorn"; }, Sex : function(val)
var Person = Class.create({
init : function(sex, devStage) {
this.sex = sex;
this.devStage = devStage || "newBorn";
},
Sex : function(val) {
if (val) { this.sex = val }
else { return this.sex; }
},
DevStage : function(val) {
if (val) { this.devStage = val; }
else { return this.devStage; }
}
});
var person = new Person("male");
var Mike = Person.extend({
init : function(sex, devStage, name, age) {
this._super(sex, devStage);
this.name = name;
this.age = age;
},
DevStage : function(val) {
if (val) { this._super(val); }
else { return this._super(); }
},
Name : function(val) {
if (val) { this.name = val; }
else { return this.name; }
},
Age : function(val) {
if (val) { this.age = val; }
else { return this.age; }
}
});
var mike = new Mike("male", "adult", "Mike", 38);
for (var k in mike) {
if (mike.hasOwnProperty(k)) { console.log("mike.hasOwnProperty(k) = " + k); }
} //only "sex", "devStage", "name" and "age" show up as properties in firebug's console
我本来希望mike对象上存在“DevStage”、“Name”和“Age”函数属性,但似乎每个对象实例上唯一的属性是发送到init函数中的属性。其他属性都在对象的原型上,工作正常,我只是无法使用hasOwnProperty方法找到它们。我已经阅读了resig在其博客上发布脚本的大部分评论,但我找不到任何与此相关的内容
我的问题是这是否正常?我可以看到,如果在对象之间执行一些属性检查,有时会出现问题。对我来说,这似乎是一个合理的担忧吗?虽然我对js并不完全陌生,但我肯定不是一个经验丰富的专业人士,因此,如果您对我目前的情况有任何反馈,我将不胜感激。是的,这是正常的。属性
DevStage
、Name
、Age
和init
附在Mike
的原型上,新对象Mike
仅指向该原型-使用new Mike()
创建对象时不会复制属性
因此,mike
没有那些属性作为“自己的属性”——它们只能通过查看mike
的内部原型属性来访问(这是JS引擎在访问属性时自动执行的操作:mike.DevStage
)。一些JS引擎,比如Chrome,将这个内部原型属性公开为\uuuuu proto\uuuu
,您可以检查它
这是对mike
如何在内部表示的描述:
mike = {
__proto__: { // Internal pointer to the prototype, for Mike
init: function () {},
DevStage: function () {},
Name: function () {},
Age: function () {},
__proto__: { // The prototype's prototype, for Person
init: function () {},
Sex: function () {},
DevStage: function () {}
// Ultimately, the prototype will point to Object.prototype
__proto__: {...}
}
},
// Own properties
name: ...,
age: ...,
sex: ...,
devStage: ...
}
如果您从循环中删除
If(mike.hasOwnProperty(k))
条件,那么您也将看到其他属性。wow…我想我从所有的研究中得到了一些惊喜=)我完全忘记了从“new”调用返回的对象。在我的大部分代码中,我都使用单例,所以我已经有一段时间没有用new实例化了。非常感谢您的快速回答和精彩的解释!!