试图围绕对象,构造函数和原型

时间:2012-01-24 13:06:42

标签: javascript

请考虑以下代码:

function Robot(weapon) {
    this.weapon = weapon;
    this.fire = function() {
        alert('Firing ' + this.weapon + 'projectile.');
    };
}

var gunRobot = new Robot('gun');

VS

function makeRobot(weapon) {
    return {
        weapon: weapon,
        fire: function() {
            alert('Firing ' + this.weapon + 'projectile.');
        }
    };
}

var laserRobot = makeRobot('laser');

因此,如果我理解正确,这两者之间的主要区别在于,在第一个示例中,gunRobot具有指向Robot的构造函数属性,而在第二个示例中,laserRobot具有指向Object的construtor属性。两者都没有为他们的原型添加任何东西,对吗?

现在,如果我将第一个示例更改为:

function Robot(weapon) {
    this.weapon = weapon;
}

Robot.prototype.fire = function() {
        alert('Firing ' + this.weapon + 'projectile.');
};

var gunRobot = new Robot('gun');

gunRobot的构造函数属性指向Robot构造函数,其原型属性具有属性fire。现在,如果我打电话

gunRobot.fire();

因为,gunRobot没有火属性,原型链中的下一个原型被访问并检查了火灾属性,对吗?

我主要是一名Java程序员,所以我很难围绕面向对象的JS概念: - )。

1 个答案:

答案 0 :(得分:1)

真的,非常接近,但考虑到这句话......

  

“gunRobot的构造函数属性指向Robot构造函数,其原型属性具有属性fire。”

...您似乎认为constructor属性是gunRobot将访问其prototype对象。

这不正确。 gunRobot对象没有自己的属性constructor,但该属性实际上是prototype对象本身的成员。

引用prototype对象的方式是内部的,因此是隐式的。

这意味着......

  • 您可以隐藏constructor对象上的gunRobot属性,但仍然隐含引用prototype对象

  • 您可以从constructor对象中删除prototype属性,prototype链不会受到影响

  • 如果完全替换构造函数的prototype对象,则已从构造函数创建的任何对象都看不到更改。他们的prototype对象引用是永久性的。只有新对象具有对新prototype对象的内部引用。


关于这个问题......

  

“两者都没有为他们的原型添加任何东西,对吧?”

...你是对的,没有任何东西被添加到任何一个对象的prototype对象中。 (当然,默认的Object.prototype对象有一些默认属性。)


  • gunRobot ----> Robot.prototype (空对象)

  • Robot.prototype ----> Object.prototype

  • Object.prototype ----> null


  • laserRobot ----> Object.prototype

  • Object.prototype ----> null