js原型式继承问题
//原型式继承
function inheritObject(o) {
//声明一个过渡函数对象
function F() {
//过渡对象的原型继承父对象
F.prototype = o;
}
//返回过渡对象的一个实例,该实例的原型继承了夫对象
return new F();
}
//测试
let book = {
name: 'js books',
alikeBook: ['css book', 'html book']
};
let newBook = inheritObject(book);
newBook.name = 'ajax book';
// newBook.alikeBook.push('xml book');
console.log(newBook.name); //ajax book
console.log(newBook.alikeBook); //undefined
console.log(book.name); //js books
console.log(book.alikeBook); //['css book', 'html book']
想问一下,问什么newBook.alikeBook
是undefined
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
按照楼上的方法,可以使你的代码实现预期的功能。我这里解释下为什么你这么写不能得到预期的效果。
这里需要说下new操作符的一个执行流程
所以,可以看到,设置原型链的操作是在第二步的时候的执行的,而这个时候,你代码里面的
F.prototype = o
还没有执行,所以instance.__proto__只会被赋值undefined,自然就没有达到继承的效果F.prototype = o;
原型指向放到构造函数里面去有点绕啊。相关问题
程序写错了。
定义:
的地方不应该在F函数内。
因为在new一个构造函数的时候,是先初始化F,再执行F里的代码,然而初始化的过程:
1、newbook = {}
2、newbook.__proto__ = F.prototype
3、F.apply(newbook)
在赋予newbook原型链的时候,F的原型是空,并没有赋值,所以结果是undefined,此时原型链是
F.prototype(空) => Object.prototype => null
函数修改如下:
应该可以了