You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从返回对象的函数原型上获取已定义属性是什么原因?

问题原因
  • 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:03