请考虑以下代码:
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概念: - )。
答案 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