原型如何在javascript中运行?

时间:2015-01-18 12:51:43

标签: javascript

我知道已经存在问题,但我必须明确这一点。

function Animal(species) {
    this.species = species;
}
Animal.prototype.getSpecies = function() {
    return "Animal is " + this.species;
};


(function() {
    var animal1 = new Animal("Snake");
    var animal2 = new Animal("Wolf");
    var animal3 = new Animal("Tiger");
}());

这就是我的理解。 enter image description here

函数/方法getSpecies()在原型对象中的所有Animal对象之间共享。 我理解正确吗?

_Proto_是指向原型对象的指针是否正确?

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

是的,你是对的,这就是它的工作原理! 但是 __proto__不是指针,它是一个引用,它的使用是被删除的。在Javascript中,实际指针不存在,但引用确实存在。

如果你创建一个继承自Animal的Type:

function FastAnimal () {
    Animal.call(this, 'extreme-fast');
}

FastAnimal.prototype = Object.create(Animal.prototype);
FastAnimal.prototype.constructor = FastAnimal;
FastAnimal.prototype.getSpeed = function () { return '1MILLION'; };


var fa = new FastAnimal();


fa.getName = function () {}

fa中查找属性或方法的方法就是这样:

  1. fa是否拥有此OWN属性(作为getName)
  2. 是否存在于FastAnimal.prototype(getSpeed)
  3. 是否存在于Animal
  4. 一般情况下:只要路上有prototype,此查询就会继续。然而,这就是在引擎盖下发生的事情并称之为原型链。

    N.B:

    如果您想循环给定Object的属性,有两种方法:

    for (var prop in obj) {
        //do stuff
    }
    

    包括原型的属性,通常不是人们想要的,这就是为什么

    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            //do stuff
        }
    }
    

    是一种常见模式,但是会出现一种新类型的循环,希望在不久的将来可以使用。

    for (var prop of obj) {}
    

    这个也明确地排除了对象原型的属性。

答案 1 :(得分:0)

是的,你是对的 如果你使用 animal1.getSpecies == animal2.getSpecies true

anima2.getSpecies == animal3.getSpecies true

只存在一个函数和原型的副本