JQuery создать прототип из объекта - PullRequest
0 голосов
/ 24 августа 2018

Я бы хотел немного обмануть при создании прототипов

например

var person = {
   name: 'John',
   age: 110,
   gender: 'm',
   ...
};

var employee = new Person(person);

function Person(args) {
   $.each(args, function(key, value) {
      this[key] = value; // Cannot create property 'key' on number
   });
}

console.log(employee.age);

В PHP это можно сделать как

function __construct() {
    $args = func_get_arg(0);            
    foreach ($args as $key => $value) {
        $this->$key = $value;
    }
    return $this;
}

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

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

var person = {
   name: 'John',
   age: 110,
   gender: 'm',
   ...
};

var employee = new Person(person);

function Person(args) {
   $.each(args, (key, value) => { //changed to arrow function to keep this in the same scope
      this[key] = value; // Cannot create property 'key' on number
   });
}

console.log(employee.age);
0 голосов
/ 24 августа 2018

Используйте bind для получения правильного объема

function Person(args) {
   $.each(args, function(key, value) {
      this[key] = value; 
   }.bind(this)); //Use bind for getting the right scope
}
0 голосов
/ 24 августа 2018

Проблема в вашем коде jQuery заключается в том, что «this» фактически находится в каждой области jquery, поэтому для создания прототипа вашего нового экземпляра вам необходимо сделать следующее:

function Person(args) {
    var _this = this;
   $.each(args, function(key, value) {
      _this[key] = value;
   });
}

Этого также можно добиться безиспользуя jQuery:

 function Person(args) {
    for(var key in args){
        this[key] = args[key];
     }
 }
...