为什么通过原型链修改属性没生效?

朱莉的笔记 阅读 50

我试着通过原型给实例对象添加一个方法,但调用的时候报错了,说不是函数。明明在构造函数的 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>
我来解答 赞 13 收藏
二维码
手机扫码查看
2 条解答
东方俊凤
兄弟你这代码本身没问题啊,我本地跑了一下完全可以正常输出"Hi, 小明"。

你先检查一下是不是在sayHi定义之前就new了实例?如果顺序反了会找不到。

还有一种常见坑是你后面又重写了整个prototype对象,比如:

Person.prototype = {
sayHello: function() {
console.log('hello');
}
};

p.sayHi(); // 报错!因为整个prototype被替换了,原来的sayHi没了


如果你用了这种写法,实例的constructor也会丢失。解决方法要么在新的prototype对象里把constructor指回来:

Person.prototype = {
constructor: Person,
sayHello: function() { ... }
};


要么就直接在原来的prototype上添加方法,别整个替换掉。

你看看你是哪种情况?
点赞
2026-03-14 15:08
❤依珂
❤依珂 Lv1
这段代码本身没问题,应该能跑。报错可能是代码执行顺序的问题——确保 p.sayHi() 是在 Person.prototype.sayHi 定义之后才调用。

如果你在控制台分段执行,先 new Person('小明') 再定义 sayHi,那就会报错,因为实例已经创建了,原型链那时候还没这个方法。

检查一下你的代码是不是分块写的,把定义放在调用前面试试。
点赞
2026-03-14 05:00