根据我对OOP javascript的有限经验,处理具有不同属性的多个对象的常用方法,但相同的方法将使用构造函数如下:
function Animal ( type ) {
this.type = type
};
Animal.prototype.sayHello = function () {
return 'Hi, I am a ' + this.type
};
var goat = new Animal( 'Goat' );
我的理解是goat
将继承/引用Animal
的功能。
我推测我可以使用以下对象文字概念复制上述内容:
var Animal = {
type : '',
sayHello : function () {
return 'Hi, I am a ' + this.type
}
}
var goat = Object.create( Animal );
goat.type = 'Goat';
这里的Animal
遗产是丢失的,还是Goat
仍然引用Animal
的方法?
我想知道使用Object.create()
而不是new
来复制构造函数/类是否存在任何问题。是否有使用new
进行的穿孔偏移或任何理由?
任何建议都会受到赞赏,如果需要澄清,我很乐意补充问题。
更新了对象
var Animal = {
sayHello : function () {
return 'Hi, I am a ' + this.type
}
}
var goat = Object.create( Animal, { 'type' : { value: 'goat' } } );
答案 0 :(得分:6)
...处理具有不同属性的多个对象的常用方法,但相同的方法将使用构造函数...
是的,另一种常见方式(正如您所见)Object.create
。
我的理解是
goat
将继承/引用Animal
的功能。
不完全。在new Animal
表达式中,goat
被赋予Animal.prototype
引用的对象作为其基础原型。 Animal
没有直接连接,只有Animal.prototype
。 (Animal.prototype
在正常情况下通过其Animal
属性返回constructor
的引用,但如果有人将新对象分配给Animal.prototype
,该链接可能会被破坏。)
这里的
Animal
遗产是丢失的,还是Goat
仍然引用Animal
的方法?
在非构造函数示例中,goat
获取Animal
作为其基础原型,因此对于goat
本身未找到的任何属性,JavaScript引擎将查看{{1}查看 it 是否拥有它。在您的示例中,这意味着Animal
正在使用goat
中的sayHello
,而不是Animal
,因为type
拥有自己的goat
。< / p>
粗略相当于:
type
...使用function Animal ( type ) {
this.type = type
};
Animal.prototype.sayHello = function () {
return 'Hi, I am a ' + this.type
};
var goat = new Animal( 'Goat' );
来设置原型,如下所示:
Object.create
重新评论:
问题包括
var animalPrototype = { sayHello: function () { return 'Hi, I am a ' + this.type } }; function createAnimal(type) { var rv = Object.create(animalPrototype); rv.type = type; return rv; }; var goat = createAnimal( 'Goat' );
内animalPrototype
,然后调用createAnimal
吗?
如果你的意思是:
Object.create(this.animalPrototype)
...然后是的,有两个问题:
function createAnimal(type) {
var animalPrototype = { // Issue #1
sayHello: function () {
return 'Hi, I am a ' + this.type
}
};
var rv = Object.create(this.animalPrototype); // Issue #2
rv.type = type;
return rv;
};
var goat = createAnimal( 'Goat' );
的每次调用都会创建一个新 animalPrototype
,这会使目的失效,而createAnimal
会调用this
1}}将是全局对象(松散模式)或createAnimal
(严格模式),因此undefined
可能不是您想要的表达式。你可以这样做:
this.animalPrototype
当然,这可能让人感到困惑,因为它看起来非常像构造函数。