Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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 出现在原型外部的JS类变量更改_Javascript_Prototype - Fatal编程技术网

Javascript 出现在原型外部的JS类变量更改

Javascript 出现在原型外部的JS类变量更改,javascript,prototype,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

我目前正在通过使用我的函数/变量对象扩展函数原型来设置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();
控制台看起来像这样


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

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

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

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
演示:


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