为什么通过原型链修改属性没生效?
我试着通过原型给实例对象添加一个方法,但调用的时候报错了,说不是函数。明明在构造函数的 prototype 上定义了啊,是不是哪里搞错了?
这是我的代码:
<script>
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log('Hi, ' + this.name);
};
const p = new Person('小明');
p.sayHi(); // 报错:p.sayHi is not a function
</script>
你先检查一下是不是在sayHi定义之前就new了实例?如果顺序反了会找不到。
还有一种常见坑是你后面又重写了整个prototype对象,比如:
如果你用了这种写法,实例的constructor也会丢失。解决方法要么在新的prototype对象里把constructor指回来:
要么就直接在原来的prototype上添加方法,别整个替换掉。
你看看你是哪种情况?
p.sayHi()是在Person.prototype.sayHi定义之后才调用。如果你在控制台分段执行,先
new Person('小明')再定义sayHi,那就会报错,因为实例已经创建了,原型链那时候还没这个方法。检查一下你的代码是不是分块写的,把定义放在调用前面试试。