【问题标题】:JavaScript - Apply one method to many objectsJavaScript - 将一种方法应用于多个对象
【发布时间】:2016-10-22 23:03:13
【问题描述】:

我听说过将一个函数或变量应用于多个对象的原型方法。但这对我不起作用。我创建了许多类似这样的对象:

var item = {
  a: {
    aa: "lalala",
    ab: 1,
    something: 3
  },
  b: {
    ba: "jfjb",
    bb: 2,
    something: 4
  }
}

但是当我知道使用原型方法时

item.prototype.bob = 2;

它不起作用并显示错误

无法设置未定义的属性“bob”

方法也一样

item.prototype.bob = function() {
   100 - this.something;
   this.something++;
}

你知道我做错了什么还是有不同的方法可以将相同的变量或函数应用于许多对象?

【问题讨论】:

  • 问题不是你分配的类型,而是item的类型。所以item.prototypeundefined。而且你不能在undefined上打电话给.bob

标签: javascript object prototype undefined


【解决方案1】:

您将类与对象实例混淆了。你只有一个匿名对象。 item 是实例,而不是类。

在下面的 sn-p 中,声明了一个类(Item,大写 i),创建了一个实例(item),并修改了类的原型。然后你会看到你可以在原型上设置一个属性并通过实例读取它,如果你愿意的话。

var Item = function() {
  a = {
    aa: "lalala",
    ab: 1,
    something: 3
  };
  b = {
    ba: "jfjb",
    bb: 2,
    something: 4
  };
}

var item = new Item();

Item.prototype.bob = 'x';

alert(item.bob);

【讨论】:

    【解决方案2】:

    经典的方式是

    function Person(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    Person.prototype.greet = function() {
        console.log(this.firstName + " says hello");
    }
    
    var pete = new Person("Peter", "Pan");
    
    pete.greet();
    

    注意prototype属性在构造函数(我们用new调用来构造对象的函数对象),而不是构造对象本身。

    在 ECMAScript 6 中,您将能够以更紧凑的方式编写此代码:

    class Person {
        constructor(firstName, lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    
        greet() {
            console.log(this.firstName + " says hello");
        }
    }
    
    new Person("Peter", "Pan").greet();
    

    【讨论】:

      【解决方案3】:

      原型属性是在类名而不是对象名上调用的。所以,如果 item 是 MyClass 类的对象,那么你应该写:

      MyClass.prototype.bob = 2;
      

      您可以通过以下链接找到更多信息:

      【讨论】:

        【解决方案4】:

        这里你的 item 本身就是一个对象,它没有任何构造函数,所以你不能在原型上定义或设置。你的代码会抛出错误

        要解决这个问题,它必须类似于以下内容

        function item(a,b){
           this.a=a;
           this.b=b;
        }
        function a(aa,ab,something){
           this.aa=aa;
           this.ab=ab;
           this.something=something
        }
        item.prototype.bob=2;
        item.prototype.method1 = function() {
           100 - this.something;
           this.something++;
        }
        

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2019-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-28
          • 1970-01-01
          • 2012-10-27
          • 2014-05-06
          • 1970-01-01
          相关资源
          最近更新 更多