了解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'
字符串。