javascript - 构造函数继承的一个问题
黄舟
黄舟 2017-04-10 17:34:52
[JavaScript讨论组]
<html>
<head>
  <title>无标题文档</title>
</head>
<body>
</body>
</html>
<script>
  function People() {
    this.age = 23;
  }
  People.prototype = {
    eat: function () {
      alert('123');
    }
  };
  function Student(name, skin) {
    People.apply(this, arguments);
  }
  var test = new Student('张三', '黄皮肤');
  console.log(test.age);
  test.eat();
</script>

为什么test.eat()方法会有错误,但是test.age又能正常输出。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(5)
高洛峰

test.eat失败,是因为test的原型链上并没有eat方法,也就是说采用构造函数继承的方法,并不会继承被继承构造函数的原型链。

而test.age能正常输出,是因为使用“apply方法”静态绑定了this对象为Student构造出的对象test,所以test具有age属性。

标准的构造函数继承可以这样写:

function Animal() {
  this.species = "动物";
}

function Cat(name,color) {
 this.name = name;
 this.color = color;
}

function Cat(name,color) {
 Animal.apply(this, arguments);
 this.name = name;
 this.color = color;
}
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); // 动物
大家讲道理

eat方法并没有被继承。

黄舟

因为你 Student 没有继承 People,单单通过 apply 方法是不能继承 People 的,要加一句话,

Student.prototype = new People();
天蓬老师
function Student(name, skin) {
    var obj = Object.create(People.prototype);
    People.apply(obj, arguments);
    return obj;
}

这样改就行,你上面就一句People.apply(obj, arguments);只是相当于调用了一下this.age = 22并没有实现继承。

大家讲道理

需要区分一下,函数变量,函数的执行 和 函数的实例化。

People = function(){
   this.age = 23;
}
People(); //函数执行

People.apply(this,arguments); // 执行的this 指向被改变。 本质还是函数执行。

函数在 new 时,会创建实例,原型被继承。

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

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