我已经在Stack Overflow和网络上的其他网站上阅读了许多有效和可理解答案的问题,我想我理解使用JavaScript制作面向对象应用程序所需的一切,除了一件事:什么是使用课程“prototype
超过this
?
this
成员,都将从构造函数(类)函数中调用,而不是为每个实例重新创建。prototype
设置方法的例子,暗示它会通过在实例上使用原始的类函数方法来节省内存,而不是一个全新的属性。因此,在评论上述两个选项中的哪一个是真的时,我想知道:是prototype
方法访问构造函数的this
(“public”)变量或实例(可能已被设置为与构造函数不同)?
编辑 - 在构造函数的范围内使用this.prototype.method = function()
是错误的吗?我已经看到的所有示例都在创建函数之后设置了原型方法。
答案 0 :(得分:1)
我将尝试通过示例回答关于原型方法与this
之间关系的问题。
来自moz docs:
如果方法在对象的原型链上,这个指的是 调用该方法的对象,就好像该方法在对象上。
示例:强>
// Our constructor function
function Example() {
this.publicGreet = "Hello World";
};
// Here the function is set as a property of the constructors prototype
Example.prototype.greet = function() {
alert(this.publicGreet);
};
// This creates a new object and invokes the constructor function
// Sets publicGreet as a property of that object and assigns it the value "Hello World"
var exampleInstance = new Example();
// Looks up the prototype chain and invokes it as a method of exampleInstance
// Remember our definition of `this` for methods on the prototype chain?
// Hence, `this` refers to exampleInstance, therefore `this.publicGreet` is "Hello World"
exampleInstance.greet();
答案 1 :(得分:1)
此测试应解释性能问题:http://jsperf.com/prototype-vs-instance-functions/6
但是,原型可以节省内存,因为定义了一个回调,实例只是指向此回调。没有必要声明同一回调的大量副本。
访问问题:在this.prototype中的函数内声明的“this”引用实例的“this”:http://jsfiddle.net/pHtjK/
var b = Function;
b.prototype.a = function(){alert(this.b);};
var xyz = new b();
b.b = 'what';
b.a();