我刚刚接触 JavaScript,并试图了解原型继承。似乎有多种方法可以达到相同的效果,所以我想看看是否有任何最佳实践或理由以一种方式做事而不是另一种方式。这就是我要说的:
// Method 1
function Rabbit() {
this.name = "Hoppy";
this.hop = function() {
console.log("I am hopping!");
}
}
// Method 2
function Rabbit() {}
Rabbit.prototype = {
name: "Hoppy",
hop: function() {
console.log("I am hopping!");
}
}
// Method 3
function Rabbit() {
this.name = "Hoppy";
}
Rabbit.prototype.hop = function() {
console.log("I am hopping!");
}
// Testing code (each method tested with others commented out)
var rabbit = new Rabbit();
console.log("rabbit.name = " + rabbit.name);
rabbit.hop();
所有这些似乎单独具有相同的效果(除非我错过了一些东西)。那么一种方法是否优于另一种方法呢?你怎么做呢?
当你在原型上放置一个方法时,每个实例对象共享对该方法的相同引用。如果您有 10 个实例,则该方法有 1 个副本。
当您执行示例 1 中的操作时,每个实例对象都有其自己的同一方法版本,因此,如果您创建 10 个对象,则会运行 10 个代码副本。
使用原型是有效的,因为 javascript 具有将函数执行与实例相关联的机制,即它设置this
函数执行的属性。
因此,高度推荐使用原型,因为它占用的空间更少(当然,除非这就是您想要的)。
在方法 2 中,您通过将原型设置为等于对象字面量来设置原型。请注意,这里您正在设置一个属性,我认为您不打算这样做,因为所有实例都将获得相同的属性。
在方法 3 中,您一次构建一个作业的原型。
对于所有事情,我更喜欢方法 3。即在我的构造函数中我设置了属性值
myObj = function(p1){
this.p1; // every instance will probably have its own value anyway.
}
myObj.prototype.method1 = function(){..} // all instances share the same method, but when invoked **this** has the right scope.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)