JavaScript - 将一种方法应用于许多对象

时间:2016-10-22 23:03:14

标签: javascript object prototype undefined

我听说过将一个函数或变量应用于多个对象的原型方法。但它不会以某种方式对我有用。我创建了许多像这样的对象:

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++;
}

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

4 个答案:

答案 0 :(得分:1)

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

在下面的代码段中,声明了一个类(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);

答案 1 :(得分:1)

经典的方式是

DECLARE @str nvarchar(max) = 'a:5:{i:1;s:1:"2";i:2;s:39:"Customer Name";i:3;s:41:"Occupation";i:4;s:9:"Extra Data";i:5;s:16:"Extra data";}';

SELECT 
  data1 = SUBSTRING([str], s1.d+1, s2.d  - (s1.d+1)),
  data2 = SUBSTRING([str], s3.d+1, s4.d  - (s3.d+1)),
  data3 = SUBSTRING([str], s5.d+1, s6.d  - (s5.d+1)),
  data4 = SUBSTRING([str], s7.d+1, s8.d  - (s7.d+1)),
  data3 = SUBSTRING([str], s9.d+1, s10.d - (s9.d+1))
FROM (VALUES (@str,CHARINDEX('"',@str))) s1([str],d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s1.d+1))) s2(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s2.d+1))) s3(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s3.d+1))) s4(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s4.d+1))) s5(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s5.d+1))) s6(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s6.d+1))) s7(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s7.d+1))) s8(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s8.d+1))) s9(d)
CROSS APPLY (VALUES (CHARINDEX('"',[str],s9.d+1))) s10(d);

请注意,prototype属性位于构造函数(我们使用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(); 调用的函数对象来构造对象),而不是构造对象本身。

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

new

答案 2 :(得分:0)

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

MyClass.prototype.bob = 2;

您可以在以下链接中找到更多信息:

答案 3 :(得分:0)

这里你的项目本身就是一个对象,它没有任何构造函数,因此你无法定义或设置原型。你的代码抛出错误

要解决此问题,必须如下所示

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++;
}

希望这有帮助