我在看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
问题:
答案 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)
原型在性能和内存使用方面更快,更便宜。在第一个示例中,当您调用new Car()
JavaScript时,只创建一个具有1个布尔属性的对象。 Car
类的所有实例与其原型共享相同的方法(方法不重复并引用相同的内存地址carA.start === carB.start
)。在第二个示例中,每次调用new Car()
时都会创建新函数(内存中的不同地址)。每个实例都有自己对方法的引用(它们并不严格相等,carA.start !== carB.start
)
当您需要使用闭包实现封装时使用方法(我建议使用Symbol
代替)。在所有其他情况下,更喜欢原型。
顺便说一下,通过原型链查找属性/方法比在V8中查找闭包要快得多。