在构造函数vs原型中声明的属性

时间:2016-02-12 02:13:46

标签: javascript inheritance prototype

在我收到重复的问题之前,请听我说。我知道之前已多次询问此问题,例如Use of 'prototype' vs. 'this' in JavaScript? 但是,我已经阅读了所有这些答案,但它没有任何意义。这些问题中的答案基本上说当你将属性放在原型中时,所有实例都会得到这种改变,因为它是共享的。但是你可以通过将属性放在所有其他对象继承自的基类中来实现完全相同的东西......我的意思是,如果你有这样的代码,例如:

var Car = function(name){
    this.name = name;
    this.printName = function(){
        console.log("Name is: " + this.name);
    }
};

var toyota = new Car("Toyota");
var mercedes = new Car("Mercedes");
var ferrari = new Car("Ferrari");


toyota.printName();
mercedes.printName();
ferrari.printName();

如果我要将顶部更改为:

var Car = function(name){
    this.name = name;
    this.printName = function(){
        console.log("PRINTING NAME");
    }
};

然后将更新从THOSE对象继承的所有实例和所有其他对象等。当你可以改变基础构造函数时,为什么你会使用原型,从中继承所有内容并且一切都会更新?

1 个答案:

答案 0 :(得分:0)

您在其他主题上阅读的所有内容都是正确的,但还有另一个略有不同的地方,就微软开发的Microsoft课程进行了解释。

从那本书:

  

每个对象都有自己的方法副本   尽管如此,由构造函数定义   它们在逻辑上都是相同的代码片段   方法的每个副本占用自己的空间   在内存中并有相应的管理   开销

总而言之,不仅仅是你要使用它的问题,它也是性能问题,所以当你同时创建数百或数千个对象时,两种方法都不完全相同,它可以有所作为。

顺便说一下,我是该课程的讲师,所以来源可靠。