代码之家  ›  专栏  ›  技术社区  ›  curiousmind

在JS中设置构造函数的原型对象与类的原型对象?

  •  0
  • curiousmind  · 技术社区  · 2 年前

    所以,我在学习javascript中的原型和OOPS概念。在玩原型的时候,我遇到了这种奇怪的行为(奇怪是因为我不知道这些概念:)。 相同的代码如下:

    let o1 = {
      sayHi() {
        console.log("hi");
      },
      sayBye() {
        console.log("Bye");
      }
    }
    
    function ex() {
      this.naam = "ash";
    }
    
    ex.prototype = o1;
    let o2 = new ex();
    
    console.log(o2);
    
    class example {
      constructor(a) {
        this.naam = a;
      }
    }
    
    example.prototype = o1;
    const e = new example("ash");
    console.log(e);

    控制台上的输出如下所示: Output for above code

    我认为这两个输出在原型方面看起来是一样的,但事实证明,直接将对象分配给类的原型对象似乎根本不起作用。

    我知道这是一种糟糕的做法,应该使用类似的东西将新的原型添加到类的原型中 Object.setPrototypeOf(example.prototype, o1) ,但为了更好地理解,我提出了这个问题。如果有人能帮我,我将不胜感激。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Yousaf    2 年前

    这个 prototype 类的属性不是 writable :

    class Example {}
    
    console.log(Object.getOwnPropertyDescriptor(Example, "prototype"));

    而在构造函数的情况下,它是可写的:

    function Example() {}
    
    console.log(Object.getOwnPropertyDescriptor(Example, "prototype"));

    这就是为什么分配给 原型 属性适用于构造函数,但不适用于类。

    如果您需要在类的原型对象上添加一个方法,请在类中定义它:

    class Example {
      sayHi() {
        console.log("hi");
      }
      sayBye() {
        console.log("Bye");
      }
    }
    
    const e = new Example();
    console.log(Object.getOwnPropertyNames(Example.prototype));
    推荐文章