了解JavaScript类方法和原型
第一个例子:了解JavaScript类方法和原型,javascript,Javascript,第一个例子: function Animal(name) { // Instance properties can be set on each instance of the class this.name = name; this.speak = function() { console.log("My name is " + this.name); } } var animal = new Animal('Petname1'); anima
function Animal(name) {
// Instance properties can be set on each instance of the class
this.name = name;
this.speak = function() {
console.log("My name is " + this.name);
}
}
var animal = new Animal('Petname1');
animal.speak();
function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();
var cat = new Cat('Petname2');
console.log(cat.speak());
第二个例子:
function Animal(name) {
// Instance properties can be set on each instance of the class
this.name = name;
}
Animal.prototype.speak = function() {
console.log("My name is " + this.name);
};
var animal = new Animal('Petname1');
animal.speak();
function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();
var cat = new Cat('Petname2');
console.log(cat.speak());
在第一个示例中,我直接添加到类中,在第二个示例中,我通过
prototype
添加。有什么区别?输出是相同的 首先,您必须了解新的
如何在Javascript上工作,这是一个很好的解释
基于此,您的两种方法之间的区别在于在创建新动物和猫时创建的speak
功能的数量
第一种方法的speak
功能实例数与Cat
和Animal
功能实例数相同。然而,第二种方法将只有一个speak
函数,不管您实例化了多少猫和动物。查看以下代码片段
在这个例子中,我们可以看到两种动物的“说话”功能是不同的
function Animal(name) {
this.name = name;
this.speak = function() {
console.log("My name is " + this.name);
}
}
var animalA = new Animal();
var animalB = new Animal();
animalA.speak === animalB.speak // false
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log("My name is " + this.name);
};
var animalA = new Animal();
var animalB = new Animal();
animalA.speak === animalB.speak // true
分配给prototype,我们可以看到两个实例的情况是相同的
function Animal(name) {
this.name = name;
this.speak = function() {
console.log("My name is " + this.name);
}
}
var animalA = new Animal();
var animalB = new Animal();
animalA.speak === animalB.speak // false
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log("My name is " + this.name);
};
var animalA = new Animal();
var animalB = new Animal();
animalA.speak === animalB.speak // true
在第一个示例中,
speak()
附加到创建的每个动物对象。您可以在运行时更改对象的speak()
行为,它将仅针对该特定对象执行
但是,第二个示例有一次定义了
speak()
,如果通过Animal.prototype.speak
赋值对所有对象进行更改,则所有对象都将获得更新版本。我在任何地方都看不到'Monty'
字符串。