Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于迭代使用resig'创建的实例的问题;s的简单js继承脚本_Javascript_Inheritance_Iteration - Fatal编程技术网

Javascript 关于迭代使用resig'创建的实例的问题;s的简单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)

在过去的一周里,我一直在尽可能多地学习js继承,并遇到了john resig的简单js继承脚本。在测试代码时,一切都很顺利,直到我尝试迭代我的一个扩展对象。代码如下:

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实例化了。非常感谢您的快速回答和精彩的解释!!