javascript 中访问原型对象最直接且通用的方法是使用 object.getprototypeof() 函数,它接受一个实例或构造函数作为参数并返回其原型。对于现代浏览器环境,也可以直接使用非标准的 __proto__ 属性进行访问。这两种方式都能让你获取到对象的原型链上游,从而读取或修改共享的属性与方法。

如何安全地获取实例的原型
在代码中,最推荐的做法是使用 Object.getPrototypeOf(),因为它符合 ECMAScript 标准且行为一致。假设你有一个构造函数 User 并创建了一个实例 user,调用该函数即可拿到原型。这种方式不会像 constructor.prototype 那样受到原型被意外覆盖的影响,能确保你拿到的是当前对象实际关联的原型对象。

function User(name) {
this.name = name;
}
User.prototype.sayHello = function() {
return 'Hello, ' + this.name;
};
const user = new User('Alice');
// 获取原型
const proto = Object.getPrototypeOf(user);
console.log(proto === User.prototype); // true
console.log(proto.sayHello()); // Hello, Alice
上述代码定义了一个简单的 User 构造函数,并为其原型添加了 sayHello 方法。通过 new User('Alice') 创建实例后,使用 Object.getPrototypeOf(user) 获取原型对象。验证结果显示,获取到的原型确实等于 User.prototype,并且可以通过该原型对象调用共享的方法,输出预期的问候语。
立即学习“Java免费学习笔记(深入)”;
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
为什么不建议使用 constructor.prototype
虽然 instance.constructor.prototype 是早期常见的写法,但它存在明显的风险。如果开发者手动修改了 constructor 属性,或者原型链被篡改,这种访问方式就会指向错误的对象。相比之下,__proto__ 虽然是非标准但广泛支持,而 Object.getPrototypeOf() 则是标准且最安全的。在实际开发中,应避免依赖 constructor 来定位原型,除非你明确知道 constructor 未被修改。

function Animal(type) {
this.type = type;
}
Animal.prototype.eat = function() { return 'eating'; };
// 模拟 constructor 被修改的情况
function Dog(name) {
this.name = name;
}
Dog.prototype = new Animal('dog');
// 此时 Dog.prototype.constructor 指向 Animal
const dog = new Dog('Buddy');
console.log(dog.constructor === Animal); // true
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true
// 如果使用 dog.constructor.prototype,得到的是 Animal.prototype
// 但如果有人写了 Dog.prototype.constructor = Dog; 则又变回 Dog.prototype
// 因此 Object.getPrototypeOf 更可靠
这段代码展示了当原型链发生继承关系时,constructor 属性的指向问题。Dog 继承了 Animal,导致 Dog.prototype.constructor 指向了 Animal。如果使用 dog.constructor.prototype,得到的将是 Animal.prototype,这可能不是开发者预期的 Dog 的原型。而 Object.getPrototypeOf(dog) 始终准确返回 dog 的直接原型,即 Dog.prototype(注意:上例中 dog 的原型是 Dog.prototype,而 Dog.prototype 的原型才是 Animal.prototype,这里需仔细区分。修正:上例中 dog 的原型是 Dog.prototype,而 Dog.prototype 是通过 new Animal('dog') 创建的,所以 Object.getPrototypeOf(dog) 返回 Dog.prototype。若直接比较 Object.getPrototypeOf(dog) === Dog.prototype 为 true。若比较 Object.getPrototypeOf(dog) === Animal.prototype 为 false。此例旨在说明 constructor 可能误导,而 getPrototypeOf 准确反映原型链结构。)
原型对象中有哪些常用属性
原型对象本身也是一个普通对象,它包含了许多默认属性和方法。例如,所有对象的原型都继承自 Object.prototype,其中包含 toString、hasOwnProperty 等方法。你可以直接在原型上添加自定义属性,这些属性会被该原型的所有实例共享。理解原型的结构有助于更好地管理内存和避免属性冲突。

















