JavaScript — Применить один метод ко многим объектам

#javascript #object #prototype #undefined

#javascript #объект #прототип #не определено

Вопрос:

Я слышал о прототипе метода для применения одной функции или переменной к нескольким объектам. Но у меня это почему-то не работает. Я создал много объектов вроде этого:

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

Но когда я знаю, используйте метод прототипа

 item.prototype.bob = 2;
  

это не работает и показывает мне ошибку

Не удается установить для свойства ‘bob’ значение undefined»

То же самое для метода

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

Вы знаете, что я делаю неправильно, или есть другой метод для применения одной и той же переменной или функции ко многим объектам?

Комментарии:

1. Проблема не в типе, который вы назначаете, а в типе item . Так item.prototype есть undefined . И вы не можете вызвать .bob on undefined .

Ответ №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);  

Ответ №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:

Свойство prototype вызывается по имени класса, а не по имени объекта. Итак, если item является объектом класса MyClass, то вам следует написать:

 MyClass.prototype.bob = 2;
  

Вы можете найти более подробную информацию по ссылкам ниже:

Ответ №4:

Здесь ваш элемент является объектом сам по себе, у него нет никакого конструктора, поэтому вы не можете определить или установить в prototype.Ваш код выдает ошибку

Чтобы исправить это, это должно быть что-то вроде приведенного ниже

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

Надеюсь, это поможет