Javascript 出现在原型外部的JS类变量更改
我目前正在通过使用我的函数/变量对象扩展函数原型来设置JavaScript类,比如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
//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对象上查找属性,如果找到,则返回该属性。如果没有找到,它会检查原型对象本身是否有原型,依此类推(允许继承链)