理解JavaScript类方法和原型

时间:2015-10-16 19:54:55

标签: 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');
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添加。有什么不同?输出是一样的。

2 个答案:

答案 0 :(得分:2)

首先,您必须了解presentViewController如何处理Javascript,而link对此有一个很好的解释。

基于此,两种方法之间的差异是在创建新动物和猫时创建的adaptivePresentationStyleForPresentationController:traitCollection函数的数量。

第一种方法的实例编号UIModalPresentationNonenewspeak相同。然而,无论您实例化了多少猫和动物,第二种方法都只有一个speak功能。请查看以下代码段。

在这一点我们可以看到两个Animal实例的'speak'函数是不同的。

Cat

分配给原型我们可以看到它对两个实例是相同的。

Animal

答案 1 :(得分:0)

在第一个示例中,speak()附加到创建的每个Animal对象。您可以在运行时更改对象的speak()行为,只会对该特定对象执行此操作。

但是,第二个示例已定义speak()一次,如果通过Animal.prototype.speak分配更改了所有对象,则所有对象都将获得更新版本。