javascript - js原型问题
巴扎黑
巴扎黑 2017-04-10 15:07:47
[JavaScript讨论组]
var F = function(){};
Object.prototype.a = function(){ console.log('a'); };
Function.prototype.b = function(){ console.log('b'); };
var f = new F();
f.a();// a
f.b();// undefined
F.a();// a
F.b();// b

为什么f继承不了b方法?

巴扎黑
巴扎黑

全部回复(4)
PHPz

大概原型是这样的

f.__proto__ -> F.prototype
F.prototype.__proto__ -> Object.prototype

所以说f是取不到b的。

然后看F:

F.__proto__ -> Function.prototype
Function.prototype.__proto__ -> Object.prototype

所以就能有a 还有b

可以参考 www.cnblogs.com/TomXu/archive/2012/01/05/2305453.html

伊谢尔伦

F 只是构造函数,new F 并不是说 f 是函数 F 的实例,而是说通过构造函数 F 生成新的对象。

ringa_lee

b方法是在Function类型上的原型上定义的,只有函数才会继承它,而通过new F()构造出来的实例f,是一个新对象,所以继承不了b
如果想让f继承b,应该在F.prototype上定义b

天蓬老师

如果就这题而言,f.b()得到undefined的原因是:

方法b不是"实例f"  的"构造函数F"的  "原型对象"上的  "方法"!

话有点长,也可以换个角度想:

实例f的"构造函数"不是Function,所以访问不了Function  的"原型对象上"的  方法!

可以来试验一下:

f.__proto__ === F.prototype // true
f.__proto__ === Function.prototype // false

本题还说到"Object" ,咱们也来比较下 :

f.__proto__.__proto__ === Object.prototype // true

可以看出f的构造函数F其实是"继承"自Object(JavaScript中没有继承,只是实现这种模式)。

总结:
- 构造函数在创建之初就自动生成了个指向原型对象的指针,指向它的"父类",F能访问到a和b都是你在父类的原型对象上操作添加后的结果。
- 实例能访问到它的构造函数的原型对象上的属性或方法 和 原型对象原型对象的属性或方法 和 原型对象。。。(此处省略N个字)。(原型链

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

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