我目前通过使用我的函数/变量对象扩展函数原型来设置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();
控制台看起来像这样
原型只是对结构的引用,然后当进行任何更改时,它会将它们复制到对象本身吗?
答案 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对象的实现中,该对象在对象本身上具有一组属性,并且对其原型具有引用。查找属性时,首先查找对象本身。如果在那里找不到,那么解释器获取原型的引用并在原型对象上查找属性。原型对象本身只是另一个对象,因此解释器直接在原型对象上查找属性,如果找到则返回它。如果没有找到,它会检查原型对象本身是否有原型等等(允许继承链)。