实例之间共享的原型属性

Which prototype properties shared between instances

本文关键字:原型 属性 共享 之间 实例      更新时间:2023-09-26

http://jsfiddle.net/F5ZSA/1/

这是上面的代码:

"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"已经指代了新对象,但对原型中另一个对象的引用仍然指代了内存中的同一空间。当您创建两个对象时,您将创建对同一对象的两个引用(在本例中为数组(

以下内容将如您所期望的那样发挥作用。为了解决"这个"问题,我在那里放了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());