javascript - js原型式继承问题
PHP中文网
PHP中文网 2017-04-11 13:18:04
[JavaScript讨论组]
//原型式继承
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.alikeBookundefined

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
伊谢尔伦

F.prototype = o;原型指向放到构造函数里面去有点绕啊。

function inheritObject(o) {
  //声明一个过渡函数对象
  function F() {
    
  }
  //过渡对象的原型继承父对象
  F.prototype = o;//这句不要放到F构造函数里面去

  //返回过渡对象的一个实例,该实例的原型继承了夫对象
  return new F();
}
PHP中文网

按照楼上的方法,可以使你的代码实现预期的功能。我这里解释下为什么你这么写不能得到预期的效果。

这里需要说下new操作符的一个执行流程

1.创建一个object
instance = new Object();
2.设置原型链
instance.__proto__ = F.prototype;
3.将上下文this指向instance,执行函数体
F.apply(instance, arguments);
4.返回值

所以,可以看到,设置原型链的操作是在第二步的时候的执行的,而这个时候,你代码里面的F.prototype = o还没有执行,所以instance.__proto__只会被赋值undefined,自然就没有达到继承的效果

PHP中文网

相关问题

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号