Javascript 实例之间共享哪些原型属性

Javascript 实例之间共享哪些原型属性,javascript,Javascript,下面是上面小提琴的代码: "use strict"; function Human() { this.myname; this.things = []; this.addThing = function(string) { this.things.push(string); } this.getThings = function() { return this.things; } thi

下面是上面小提琴的代码:

"use strict";

function Human()
{
    this.myname;
    this.things = [];
    this.addThing = function(string)
    {
        this.things.push(string);
    }

    this.getThings = function()
    {
        return this.things;
    }

    this.setName = function(name)
    {
        this.myname = name;   
    }

    this.getName = function()
    {
        return this.myname;   
    }
}

Mister.prototype = new Human();
function Mister()
{

}

var mister1 = new Mister();
var mister2 = new Mister();

mister1.setName("Peter");
mister2.setName("Steven");

mister1.addThing("mister1 reporting");
mister2.addThing("mister 2 reporting");

console.log(mister1.getName());
console.log(mister2.getName());
console.log(mister1.getThings());
console.log(mister2.getThings());
运行它时,结果表明每个Mister实例的“myname”属性不同,而“things”属性似乎在所有实例之间共享。是这样吗?如果是,说明哪些原型属性在“继承”对象之间共享的一般规则是什么


来自其他OOP语言,我的直觉是每个对象都应该有一个单独的原型实例。尝试在js中实施它是一个好主意吗?

这是来自传统OOP语言的经典问题。通过创建新对象,原型将被复制。关键字“this”已经引用了新对象,但是引用了原型中的另一个对象作为您的this。this仍然引用内存中的相同空间。创建两个对象时,会创建对同一对象的两个引用(在本例中为数组)

以下内容将按照您的预期工作。为了解决“this”问题,我将调用init方法初始化对象,在本例中创建多个数组对象,每个对象都用于新对象Mister

var Human = function()
{

    this.myname;
    this.things;
    this.things;

    return {
      addThing:function(string)
      {
          this.things.push(string);
      },

      getThings:function()
      {
          return this.things;
      },

      setName: function(name)
      {
          this.myname = name;
      },

      getName: function()
      {
          return this.myname;
      },
      init: function(){
              this.things = new Array();
            }
    }

}


var Mister = function(){}
Mister.prototype = new Human();

var mister1 = new Mister();
var mister2 = Object.create(Mister.prototype);
mister1.init();
mister2.init();


mister1.setName("Peter");
mister2.setName("Steven");

mister1.addThing("mister1 reporting");
mister2.addThing("mister 2 reporting");

console.log(mister1.getName());
console.log(mister2.getName());
console.log(mister1.getThings());
console.log(mister2.getThings());

这是因为misterX原型是同一个对象。人类中的关键字“this”是先生上下文而不是人类上下文。但是在数组的情况下,它指的是内存中相同的东西。是的,但是为什么在“myname”的情况下,它在内存中对Mister1和Mister2都不是相同的东西呢?数组的不同之处是什么?new Human()与Object.create(Human.prototype)是一样的。它通过克隆原型中的任何东西来创建新对象。在javascript中,原语变量通过值复制,对象(数组)通过引用复制。这就是为什么您的名称不同,但指向数组的指针相同。请在javascript中查找this关键字。它的行为方式与传统的OOP语言不同。在本例中,mister1中的“this”指向mister1,mister2中的“this”指向mister2,但是this.things指向javascript中的数组引用,尽管mister1.things和mister2.things不是相同的东西:)这很好,非常感谢。我写这篇文章是为了模仿传统的OOP:我想知道在JS中使用这种机制是否是一种好的实践。在我当前的项目中,我想使用发布/订阅模式,因此我创建了一个“EventDispatcher”类来继承。现在,我假设每个继承对象都应该有一个单独的订阅者列表,但是可以为所有对象保留一个列表。在JS世界中,哪种方式更合适?