JavaScript原型与实践中的对比

时间:2013-11-30 18:06:46

标签: javascript oop

我已经在Stack Overflow和网络上的其他网站上阅读了许多有效和可理解答案的问题,我想我理解使用JavaScript制作面向对象应用程序所需的一切,除了一件事:什么是使用课程“prototype超过this

的真实,实用的目的
  • 我已经读过,任何方法,甚至一个设置为this成员,都将从构造函数(类)函数中调用,而不是为每个实例重新创建。
  • 我见过许多使用prototype设置方法的例子,暗示它会通过在实例上使用原始的类函数方法来节省内存,而不是一个全新的属性。

因此,在评论上述两个选项中的哪一个是真的时,我想知道:是prototype方法访问构造函数的this(“public”)变量或实例(可能已被设置为与构造函数不同)?

编辑 - 在构造函数的范围内使用this.prototype.method = function()是错误的吗?我已经看到的所有示例都在创建函数之后设置了原型方法

2 个答案:

答案 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();