JavaScript中的对象继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript中的对象继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3339字,纯文字阅读大概需要5分钟。
内容图文
![JavaScript中的对象继承](/upload/InfoBanner/zyjiaocheng/705/0bf4073e4621481ab73b570410196a9e.jpg)
我的问题是关于维护其父对象的原型链的子对象.
在John Resig的高级Javascript幻灯片(http://ejohn.org/apps/learn/#76)中,他写道,为了维护子对象的原型链,您必须实例化一个新的父对象.
然而,通过几个快速测试,我注意到通过将子对象原型设置为等于父对象原型来维护原型链.
任何澄清将不胜感激!
原始代码
function Person(){}
Person.prototype.dance = function(){};
function Ninja(){}
// Achieve similar, but non-inheritable, results
Ninja.prototype = Person.prototype;
Ninja.prototype = { dance: Person.prototype.dance };
assert( (new Ninja()) instanceof Person, "Will fail with bad prototype chain." );
// Only this maintains the prototype chain
Ninja.prototype = new Person();
var ninja = new Ninja();
assert( ninja instanceof Ninja, "ninja receives functionality from the Ninja prototype" );
assert( ninja instanceof Person, "... and the Person prototype" );
assert( ninja instanceof Object, "... and the Object prototype" );
我的修改版
function Person(){}
Person.prototype.dance = function(){console.log("Dance")};
function Ninja(){}
// Achieve similar, but non-inheritable, results
Ninja.prototype = Person.prototype;
assert( (new Ninja()) instanceof Person, "Will fail with bad prototype chain." );
var ninja = new Ninja();
assert( ninja instanceof Ninja, "ninja receives functionality from the Ninja prototype" );
assert( ninja instanceof Person, "... and the Person prototype" );
assert( ninja instanceof Object, "... and the Object prototype" );
ninja.dance();
解决方法:
在John Resig提供的代码中,他首先将Ninja.prototype设置为Person.prototype.然后他立即将其重置为{dance:Person.prototype.dance}:
// Achieve similar, but non-inheritable, results
Ninja.prototype = Person.prototype;
Ninja.prototype = { dance: Person.prototype.dance };
结果是Ninja构造函数创建的任何对象都将直接继承自{dance:Person.prototype.dance},而不是Person.prototype的实例.因此(新忍者)instanceof Person将返回false.在这种情况下,原型链是:
null
^
|
| [[prototype]]
|
+------------------+
| Object.prototype |
+------------------+
^
|
| [[prototype]]
|
+------------------+
| Ninja.prototype |
+------------------+
^
|
| [[prototype]]
|
+------------------+
| new Ninja |
+------------------+
在修改后的版本中,您删除了对Ninja.prototype的第二个赋值,有效地将Ninja.prototype设置为Person.prototype.因此原型链是:
null
^
|
| [[prototype]]
|
+-------------------+
| Object.prototype |
+-------------------+
^
|
| [[prototype]]
|
+-------------------+
| Ninja.prototype / |
| Person.prototype |
+-------------------+
^
|
| [[prototype]]
|
+-------------------+
| new Ninja |
+-------------------+
请注意,由于Ninja.prototype与Person.prototype相同,所以(新忍者)inance of Ninja和(新忍者)instanceof Person将返回true.这是因为instanceof operator depends on the prototype of a constructor.
然而,在JavaScript中实现继承的正确方法是将Ninja.prototype设置为Object.create(Person.prototype)(或者以旧学校的方式设置为新Person),在这种情况下,原型链将是:
null
^
|
| [[prototype]]
|
+------------------+
| Object.prototype |
+------------------+
^
|
| [[prototype]]
|
+------------------+
| Person.prototype |
+------------------+
^
|
| [[prototype]]
|
+------------------+
| Ninja.prototype |
+------------------+
^
|
| [[prototype]]
|
+------------------+
| new Ninja |
+------------------+
注意:永远记住,JavaScript对象继承自其他对象.它们从不继承构造函数.如果您想了解JavaScript中的真正原型继承,请阅读我在why prototypal inhritance matters的博客文章.
内容总结
以上是互联网集市为您收集整理的JavaScript中的对象继承全部内容,希望文章能够帮你解决JavaScript中的对象继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。