在 JavaScript 中,只有函数(特别是构造函数)才有 prototype
属性。这个属性用于定义所有实例共享的方法和属性。
详细说明
-
函数的
prototype
属性:- 每个函数都有一个
prototype
属性,默认为一个空对象。 - 当使用
new
关键字调用构造函数时,新创建的对象会自动将其__proto__
指向构造函数的prototype
。
function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice'); alice.sayHello(); // Hello, my name is Alice
- 每个函数都有一个
-
非函数对象:
- 普通对象(如通过字面量创建的对象)没有
prototype
属性,但它们仍然有一个隐式的__proto__
属性,指向它们构造函数的prototype
。
const obj = {}; console.log(obj.prototype); // undefined console.log(obj.__proto__); // Object.prototype
- 普通对象(如通过字面量创建的对象)没有
-
类(ES6+):
- 在 ES6 中,类实际上是函数的一个语法糖,类的实例也具有
prototype
属性。
class Animal { constructor(name) { this.name = name; } } Animal.prototype.speak = function() { console.log(`${this.name} makes a noise.`); }; const dog = new Animal('Dog'); dog.speak(); // Dog makes a noise.
- 在 ES6 中,类实际上是函数的一个语法糖,类的实例也具有
总结
- 只有函数(构造函数)有
prototype
属性,用于定义实例共享的方法和属性。 - 普通对象没有
prototype
属性,但它们的原型链仍然可以指向其他对象的prototype
。
前端工程师、程序员