【问题标题】:Properties declared in constructor function vs prototype在构造函数与原型中声明的属性
【发布时间】:2016-02-12 02:13:46
【问题描述】:

现在,在我被标记为重复问题之前,请听我说完。我知道这个问题之前已经被问过很多次了,比如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 对象的所有其他对象等等都会被更新。当您可以更改继承所有内容并更新所有内容的基本构造函数时,为什么还要使用原型?

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    您在其他主题上阅读的所有内容都是正确的,但还有另一个细微差别,在 Microsoft javascript 开发课程中进行了说明。

    来自那本书:

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

    总而言之,这不仅取决于您是否会使用它,还取决于性能,因此当您同时创建数百或数千个对象时,这两种方法并不完全相同,它可能会有所作为。

    顺便说一句,我是该课程的讲师,因此来源可靠。

    【讨论】:

    • 这是很多人怀念的。该基本函数是构造函数。您不想将所有内容都打包在构造函数中。这就是原型的用途。
    • 是的,我知道整个内存和性能问题,并且我理解在构造函数中拥有新属性意味着每个实例都有自己的副本。我唯一不明白的是,当人们说当你改变原型上的函数时,所有的实例都会改变。但是如果你把它放在构造函数中,那么它们无论如何都会改变,那么为什么要使用原型呢?
    • 没错,感谢 Atticus,这两种方法都可以完成您想要的,重要的是要说大多数网站的表单并不重要,但是当您构建复杂的前端应用程序时相同对象的实例可能会影响您的性能。如今,大多数计算机都有一个非常好的硬件,可以为您提供大量内存,但这始终是一件好事。
    • 不,我理解性能部分,它的整个“更改实例属性”是没有意义的。
    • 因为它是相关的,不是关于性能而是关于内存处理。当你改变原型时,你并没有改变所有的实例,你只是改变了所有实例共享的公共内存空间。对于构造函数来说,情况并非如此。构造函数只是创建新对象的函数。如果您使用相同的构造函数来创建两个对象,则每个对象都会获得其自己的一组属性,这些属性由构造函数定义。虽然这对数据属性很有用,但同样的机制对方法不太有用。
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2016-04-25
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多