JS类变量更改出现在原型之外

时间:2014-05-14 15:30:25

标签: javascript prototype

我目前通过使用我的函数/变量对象扩展函数原型来设置JavaScript类....

//class shorthand
var clss = function(args){
    var c = function() {};
    _.extend(c.prototype, args); //using underscore.js
    return c;
};

//class definition
var ThisIsMyClass = clss({
    varExample: 5,
    test: function() {
        console.log(this.varExample);
    },
    alter: function(){
        this.varExample = 8;
    }
});

//class initialisers
var hello = new ThisIsMyClass();
var hi = new ThisIsMyClass();
var ayup = new ThisIsMyClass();

我的问题是,所有内容都位于ThisIsMyClass.prototype内,并且可以调用函数并读取变量,但是当值发生更改时,它们会出现在该对象的原型之外(并且还保留在具有原始价值的原型)?

运行此代码后

//class initialisers
hello.varExample = 6;
hi.alter();
//look at object structure
console.log(hello);
console.log(ayup);
console.log(hi);
//trace the values
hello.test();
ayup.test();
hi.test();

控制台看起来像这样 Console

原型只是对结构的引用,然后当进行任何更改时,它会将它们复制到对象本身吗?

1 个答案:

答案 0 :(得分:1)

当您读取对象上的属性时,解释器首先查看该属性的实际对象本身。如果它在那里找到它,它将返回该值。如果它没有在实际对象上找到属性,那么它会查看原型。如果它在原型上找到属性,则返回该值。

在对象上设置属性时,它始终在实际对象上设置属性(而不是在原型上)。因此,一旦您在对象上设置了属性,对该属性的任何读取都将来自您在实际对象上设置的属性,而不是原型上的属性。直接在对象上设置属性"隐藏"或者"覆盖"原型上设置的值。您可以将原型视为属性的默认值,但只要在对象本身上设置一个原型,就不再使用原型值。

function foo() {}

foo.prototype.greet = function() {
    console.log("Hello");
}

var x = new foo();
x.greet();        // will log "Hello" - finds method on the prototype

// set new method - will set this property directly on the object itself
//   overriding what was on the prototype
x.greet = function() {
    console.log("Goodbye");
}
x.greet();        // will log "Goodbye" - finds method on the object

演示:http://jsfiddle.net/jfriend00/h6akb/


在javascript对象的实现中,该对象在对象本身上具有一组属性,并且对其原型具有引用。查找属性时,首先查找对象本身。如果在那里找不到,那么解释器获取原型的引用并在原型对象上查找属性。原型对象本身只是另一个对象,因此解释器直接在原型对象上查找属性,如果找到则返回它。如果没有找到,它会检查原型对象本身是否有原型等等(允许继承链)。