假设我有一个javascript构造函数:
function Person(name) {
this.name = name;
this.hello = function () { return "It's a-me, " + name + "!"; };
}
Person
“类型”有一个方便的方法hello
,我希望在另一个类型Student
上重用它。我希望Student
具有以下结构:
function Student(name) {
this.name = name;
this.hello = function () { return "It's a-me, " + name + "!"; };
this.books = [];
}
一种选择是使用上面Student
的代码,这是次优的,因为通常的原因,例如,如果我想让它镜像Person
类型,那么我必须手动保持他们的代码同步,无论如何,这是不好的。
第二个选项(来自this answer)是执行类似以下操作:
function Student(name) {
Person.call(this, name);
this.books = [];
}
当我mario = new Student("mario")
时,我得到以下结果:
Object { name: "mario", hello: hello(), books: [] }
我已经成功地实现了我想要的继承,但是这有一个不幸的特性,那就是把所有想要的属性都放到了我的对象中。值得注意的是,例如,在mario
上有一个“hello”属性。如果能在原型链中查找到这个“hello”属性,那就太好了。
给定了相关的对象构造函数,我如何巧妙地创建一个原型链?
4条答案
按热度按时间jtjikinw1#
使用
new
创建对象时,构造函数的this
值将设置为该对象,并且该对象的原型将设置为正在调用的构造函数的原型。这就是为什么您的属性当前被添加到创建的对象。
但是,如果您想向原型添加属性,以便可以使用继承,那么在ES5 Javascript中,您可以通过将属性直接分配给构造函数的原型来实现。
希望能有所帮助!
4uqofj5v2#
你可以根据自己的需要使用原型法或类糖法。下面是一个简单的例子:
ix0qys7i3#
对于较长的链,请使用Object.assign,下面是使用Object.assign创建既是Person又是Student的GradStudent的示例
ycl3bljg4#
我可以用以下方法来完成这样的事情:
然而,我对javascript不够熟悉,不知道这个解决方案可能会出现什么问题,来自其他OO风格的语言,
mario
的prototype
作为Person
的实际示例感觉很奇怪,但我认为js中的所有东西在某种意义上都是示例,所以这可能只是我的偏见。