joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

在 JavaScript 中,只有函数(特别是构造函数)才有 prototype 属性。这个属性用于定义所有实例共享的方法和属性。

详细说明

  1. 函数的 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
    
  2. 非函数对象

    • 普通对象(如通过字面量创建的对象)没有 prototype 属性,但它们仍然有一个隐式的 __proto__ 属性,指向它们构造函数的 prototype
    const obj = {};
    console.log(obj.prototype); // undefined
    console.log(obj.__proto__); // Object.prototype
    
  3. 类(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.
    

总结

  • 只有函数(构造函数)有 prototype 属性,用于定义实例共享的方法和属性。
  • 普通对象没有 prototype 属性,但它们的原型链仍然可以指向其他对象的 prototype
posted on 2024-10-28 21:31  joken1310  阅读(25)  评论(0编辑  收藏  举报