无法从返回对象的函数原型上获取已定义属性是什么原因?
问题原因
- 使用
new关键字调用函数时,默认会创建一个继承自构造函数prototype属性的新对象,将函数内的this绑定到这个对象,最后默认返回这个对象 - 如果构造函数显式返回了一个非原始类型的值(对象/数组/函数等),
new操作符会直接返回你自定义的这个返回值,而不是默认创建的、绑定了构造函数原型的对象
你写的greet函数最后return {hello},返回的是一个全新的普通对象,它的原型链上只有Object.prototype,根本没有继承greet.prototype,自然访问不到上面的dev属性。
解决方法
方案1:不手动返回自定义对象,将方法挂载到this上
这是最符合构造函数设计逻辑的写法:
function greet() { this.hello = function(name) { console.log(`Hello ${name}`); } } greet.prototype.dev = "Dev name"; let greetObj = new greet(); console.log(greetObj.dev) // 输出 "Dev name" greetObj.hello("张三") // 正常输出 Hello 张三
方案2:保留返回对象的写法,手动绑定返回对象的原型
如果不想修改原有代码的结构,手动指定返回对象的原型为greet.prototype即可:
function greet() { function hello(name) { console.log(`Hello ${name}`); } // 手动指定返回对象的原型 return Object.setPrototypeOf({hello}, greet.prototype) } greet.prototype.dev = "Dev name"; let greetObj = new greet(); console.log(greetObj.dev) // 输出 "Dev name"
也可以用Object.create直接基于greet.prototype创建要返回的对象:
function greet() { // 基于greet.prototype创建实例对象 const obj = Object.create(greet.prototype) obj.hello = function(name) { console.log(`Hello ${name}`); } return obj }
内容的提问来源于stack exchange,提问作者Nikhil Pathania
相关产品推荐
相关产品推荐

