JavaScript-js关于继承的问题

发布于 2017-01-08 03:29:14 字数 410 浏览 1287 评论 2

我知道这样可以实现继承

function Father(){
  this.name=name;
}
Father.prototype.sayName=function(){
  alert(this.name);
}
function Son(name,age){
  this.name=name;
  this.age=age;
  this.sayAge=function(){
  alert(this.age);
}
}
Son.prototype=new Father();
var son=new Son("zhangsan",20);
son.sayName();
son.sayAge()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑾兮 2017-09-21 01:04:37

仅仅执行Father方法和new Father()是不一样的。

this.method=Father;
this.method(name);

只能让this获得name属性,但是内部属性__proto__并没有指向Father.prototype,所以Son的实例无法调用sayName

所以在某些可以改动__proto__的浏览器上这么写就行了

function Son(name,age){
this.method=Father;
this.method(name);
this.__proto__ = Father.prototype; //加上它就可以调用啦
delete this.method;
this.age=age;
this.sayAge=function(){
alert(this.age);
}

但是这么写继承带来的问题太多了

泛泛之交 2017-05-22 08:14:48

 exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};

这是Node.js的继承处理。
实际处理过程是复制一份父类的prototype到子类的prototype。而不是初始化一个父类的实例拷贝到prototype。你可以用chrome浏览器的debug看一下,实际结构是不一样的。
js可以理解为,请求object的某个变量或函数时,先从object中查找,如果找到,则直接调用,如果没找到,则再到prototype中查找。
将父类的prototype拷贝到子类的prototype中,然后对子类进行操作时,就可以查找到父类的prototype中的函数。
如果将父类的实例拷贝到子类的prototype中,实际结构应该是这样的了:

 object
object的属性
prototype // 父类实例
父类的属性
prototype

这样也是搜索不到父类prototype下的函数。
这个东西我说不清。。。希望你能意会。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文