2015-10-17 124 views
0

所以我一直在试图找出在Javascript中的原型继承,我仍然困惑的一点。假设我想为具有自己的几个功能的人构造一个构造函数。在JavaScript中构造函数的最佳做法是什么?

function Person(name) { 
    this.name = name; 
    this.sayName = function() { 
    console.log("My name is " + name); 
    } 
} 

var john = new Person("John"); 

john.sayName(); 

因此,在这种情况下,我已经创建了一个对象,并调用的函数,但是这似乎并没有要做到这一点的有效途径。我已经看到了另外一个例子是这样的:

function Person(name) { 
    this.name = name; 
} 
Person.prototype.sayName = function() { 
    console.log("My name is " + name); 
} 

var john = new Person("John"); 

john.sayName(); 

现在我读过的第二个目的是更有效,因为它没有存储在其内部的sayName功能,取而代之的则是怎么回事了原型链,直到找到它Persons中的原型对象。

我不确定的是我应该用于复杂的构造函数。在我看来,第一个片段比第二个片段更容易阅读,因为它有一个明确的层次结构,但第二个片段据说更有效率。

在现实世界的场景中,哪种风格的构造函数更容易使用?

编辑:我有一个后续问题。有什么办法让第二个片段更具可读性?

+2

**第二**,考虑是否要创建1000个用户。第一个_can_用于单例类(只有一次初始化,单个对象)。 – Tushar

+0

取决于您打算创建的实例的数量。如果它是只有一个实例的一次性对象,则第一种方法很好。否则,您将不必要地在每个实例中存储同一成员函数的多个实例。 – techfoobar

+0

尽量在功能上坚持原型 – Saar

回答

0

通常,如果您打算创建一个将创建多个实例的类,则应该将这些方法添加到原型对象中。我相信的主要原因是一个类的所有实例都会引用原型对象,并且不会复制它。所以如果原型对象发生变化,它将反映在所有实例引用的原型对象中。

这比在每个实例上创建(复制)每个方法的第一个选项要好。所以很多实例也意味着很多这些方法将被创建,占用内存。但在第二种选择中,它们都使用原型对象上创建的单个方法。

0

如果您使用第一个函数,那么每次调用构造函数时都会为sayName创建一个新的函数对象,而第二种方法则可以避免这种开销。

如果你使用它会被共享, 为前在构造函数的引用类型:

function Person(name){ 
    this.name = name; 
    this.hobbies = [..some hobbies]; 
} 

现在的爱好将每一个共享对象,你创建这个构造函数,所以最好把共享属性在原型上,只在构造函数中使用唯一的一个

0

第一种方法将为每个单个实例创建方法函数。在第二个例子中,所有实例都共享原型中定义的方法。所以第二种方法更好,因为节省了内存。

但是,ECMAScript的6正式发布几个月前,那么为什么不尝试class

class Person { 
    constructor(name) { 
    this.name = name; 
    } 

    sayName() { 
    console.log("My name is " + this.name); 
    } 
} 

var john = new Person("John"); 
john.sayName(); // "My name is John" 

的功能不能很好地支持呢,如果你想在浏览器的向后兼容性,使用Babel

0

在ECMAScript中5引入了创建类的实例,另一种语法是:

Object.create(prototype [, propertiesObject ]) 

例子:

var MyClass = function (param) { 
    this.field1 = param; 
} 
MyClass.prototype.changeField = function(param){ 
    this.field1 = param; 
} 
var instance = Object.create(MyClass.prototype); 

如果您有兴趣了解的JavaScript我建议一本书叫“掌握先进的东西Javascript设计模式“。

相关问题