为什么要使用原型而不是方法

时间:2018-01-21 19:27:13

标签: javascript methods prototype

我在看tutorial about functions。还有一个例子

function Car(){
this.running = false
}
Car.prototype.start = function(){
    this.running = true
}
Car.prototype.stop = function(){
    this.running = false
}

var c = new Car()
c.running // false
c.start // true
c.running // true

但还有另一种方法可以做同样的事情

function Car(){
    this.running = false;
    this.start = function(){
        this.running = true
    }
    this.stop = function(){
        this.running = false
    }
}

var c = new Car()
c.running // false
c.start // true
c.running // true

问题:

  1. 与方法相比,使用原型的优缺点是什么?
  2. 什么时候应该避免/使用原型?
  3. 什么时候应该避免/使用方法?

2 个答案:

答案 0 :(得分:1)

理想情况下,只要您想在类型的多个实例之间共享属性,就可以使用原型。在你的第一个例子中

function Car() {
  this.running = false
}
Car.prototype.start = function() {
  this.running = true
}
Car.prototype.stop = function() {
  this.running = false
}

var c = new Car()
var d = new Car()
var e = new Car()
console.log(c.__proto__ === d.__proto__) //true
c.running // false
c.start // true
c.running // true

这里原型对象对于c,d和e将保持相同,因此您正在节省运行时内存消耗,因为您正在为所有三个使用相同的函数,但具有不同的上下文。

在你的第二个例子中

function Car(){
    this.running = false;
    this.start = function(){
        this.running = true
    }
    this.stop = function(){
        this.running = false
    }
}

var c = new Car() // check comparing  c.__proto__ ===  d.__proto__
var d =  new Car()
var e = new Car()
c.running // false
c.start // true
c.running // 

这里c,d,e将拥有自己的功能副本,消耗更多内存!! 理想情况下,在设计此类对象时应考虑可重用性。原型方法似乎比方法方式更好,更高效。

答案 1 :(得分:1)

  1. 原型在性能和内存使用方面更快,更便宜。在第一个示例中,当您调用new Car() JavaScript时,只创建一个具有1个布尔属性的对象。 Car类的所有实例与其原型共享相同的方法(方法不重复并引用相同的内存地址carA.start === carB.start)。在第二个示例中,每次调用new Car()时都会创建新函数(内存中的不同地址)。每个实例都有自己对方法的引用(它们并不严格相等,carA.start !== carB.start

  2. 当您需要使用闭包实现封装时使用方法(我建议使用Symbol代替)。在所有其他情况下,更喜欢原型。

  3. 顺便说一下,通过原型链查找属性/方法比在V8中查找闭包要快得多。

    1. 看#2