javascript原型的替代方案(或相同?)

javascript原型的替代方案(或相同?),javascript,prototype,Javascript,Prototype,我想了解javascript中的原型设计。 例如: 1) 2) 我得到的obj1和obj2是一样的。那么,我在2)中所做的也是原型?还是不?关于prototype,我遗漏了什么?obj1和obj2略有不同,我将快速解释一下JavaScript中的prototype继承 原型是一个对象,就像任何其他对象一样 每个具有原型的对象都将从中继承所有属性和方法,如果它们已经在对象中定义,则会覆盖它们。原型引用是活动的,这意味着,无论何时修改作为另一个对象原型的对象,更改都会反映在该对象中 您使用的是伪经典

我想了解javascript中的原型设计。 例如:

1)

2)


我得到的obj1obj2是一样的。那么,我在2)中所做的也是原型?还是不?关于prototype,我遗漏了什么?

obj1和obj2略有不同,我将快速解释一下JavaScript中的prototype继承

原型是一个对象,就像任何其他对象一样

每个具有原型的对象都将从中继承所有属性和方法,如果它们已经在对象中定义,则会覆盖它们。原型引用是活动的,这意味着,无论何时修改作为另一个对象原型的对象,更改都会反映在该对象中

您使用的是伪经典继承方法,即定义一个
构造函数
函数,该函数将返回“类”的实例。该类的所有实例都将在以下位置定义对象作为其原型对象:
Constructor.prototype
,您可以向该原型添加方法或属性,这些方法或属性将添加到“类”的每个实例中

为什么obj1和obj2不同

obj1不直接引用
fn
方法,而是引用原型,原型有方法,因此obj1也有方法

obj2直接引用方法,这意味着它是对象的自有属性

您可以通过更改原型的方法来更改obj1的fn方法,MyObject的任何其他实例(如obj1)也将更改

但在obj2中不能这样做,如果修改obj2的方法,只需替换该实例的方法

我希望你有所收获,如果你有任何疑问,尽管问

关于编写“类”:JavaScript没有类,它用原型模拟类继承,您可以使用
对象使用原始原型继承。创建
,您会发现它更简单。

2)不是原型化

下面是一个简单的示例,解释了两种方法的区别:


1)

在这里,您可以在创建
obj1
后更改prototype对象,但是此更改会影响对象,因为它引用了当前prototype对象

因为
obj2
也有一个对原型对象的引用,所以通过调用函数
fn
也可以得到“2”

此处所有实例共享同一原型对象。


2)

这里每个对象都有自己的
fn
功能。如果一个对象更改了函数,它只会影响当前对象。

假设我们有

var A = new Object1(),
    B = new Object1(),
    X = new Object2(),
    Y = new Object2(),
    fn2 = function () {
        console.log(2);
    };
考虑(为每个重置)

    • A.fn===B.fn;//正确
    • X.fn==Y.fn;//错误
    • Object1.prototype.fn=fn2
      then
      A.fn();//2
    • Object2.prototype.fn=fn2
      但是
      X.fn();//1
    • A.fn=fn2
      now
      A.fn();//2
      but
      B.fn();//1
    • X.fn=fn2
      now
      X.fn();//2
      Y.fn();//1
    • “fn”在A中;//正确
      A.hasOwnProperty(“fn”);//错误
    • “fn”在X中;//true
      X.hasOwnProperty(“fn”);//正确
  • 我们能从中学到什么?

    原型化在实例之间共享,但不直接在实例上设置属性,而在构造函数中设置属性每次都会创建新的和单独的属性。

    只需将
    MyObject.prototype
    想象为一个对象,它由从
    MyObject
    构造函数创建的所有对象共享。因此,即使您从
    MyObject
    创建了1000个新对象,它们都将共享(继承)
    .prototype
    对象的所有属性。感谢所有评论和回答+1.我必须选择一个作为答案。原型是共享的,这个.fn是为每个实例创建的。有关原型和继承的更多信息,请参见此处:
    var MyObject = function() {
        this.a = "a";
        this.fn = function() {console.log('1');}
        return this;
    }
    
    var obj2 = new Object2();
    
    var MyObject1 = function() {
        this.a = "a";
        return this;
    }
    
    MyObject1.prototype.fn = function() {console.log('1');}
    
    var obj1 = new MyObject1();
    
    // change the prototype again
    MyObject1.prototype.fn = function() {console.log('2');}
    
    var obj2 = new MyObject1();
    
    obj1.fn(); // logs '2'
    obj2.fn(); // logs '2'
    
    var MyObject2 = function() {
        this.a = "a";
        this.fn = function() {console.log('1');}
        return this;
    }
    
    var obj3 = new MyObject2();
    
    // change the function
    obj3.fn = function() {console.log('2');}
    
    var obj4 = new MyObject2();
    
    obj3.fn(); // logs '2'
    obj4.fn(); // logs '1'
    
    var A = new Object1(),
        B = new Object1(),
        X = new Object2(),
        Y = new Object2(),
        fn2 = function () {
            console.log(2);
        };