JavaScript OOP:带或不带"原型"的方法定义

Jea*_*tin 13 javascript oop methods prototype

这是代码吗

function Person() {
    function  myMethod() {
        alert ('hello');
    }
    this.method = myMethod;
}
Run Code Online (Sandbox Code Playgroud)

相当于:

function Person() {    }
Person.prototype.method2  = function() {
    alert ('hello');
};
Run Code Online (Sandbox Code Playgroud)

如果是,我应该使用哪种方法定义?为什么?

Mat*_*eer 13

它们在您的简单示例中功能相同,但在幕后工作方式却截然不同.prototype函数的属性实际上是"原型模板".它说"无论何时制作一个对象,我都被用作对象的构造函数,给它们这个对象作为它们的原型".

因此Person,在第二个示例中创建的所有内容都共享该method2方法的相同副本.

在第一个示例中,每次解释器遇到function关键字时,它都会创建一个新的函数对象.所以在第一个例子中,每个实例Person都有自己的myMethod方法副本.绝大多数时候这无关紧要.但是这第一种方法使用更多的内存,有时这很重要.

在更有趣的情况下,它们在功能上并不相同.在第一个例子中,myMethod可以访问定义的局部变量Person,但第二个例子不能,作为一个区别.

  • 第一种情况允许您拥有"私有"变量.在`Person`方法中定义的任何局部变量都可以通过`myMethod`访问,但不能被其他任何东西访问.我建议阅读Crockford的*JavaScript the Good Parts*,因为他非常详细地介绍了这种模式. (2认同)