Передача объекта в качестве параметра функции конструктора и копирование его свойств в новый объект? - PullRequest
26 голосов
/ 20 января 2011

У меня есть такой конструктор JavaScript:

function Box(obj) {
    this.obj = obj;
}

который я хочу передать объект в качестве параметра, как это:

var box = new Box({prop1: "a", prop2: "b", prop3: "c"})

и дает мне что-то вроде этого:

box.obj.prop1
box.obj.prop2
box.obj.prop3

но я бы хотел, чтобы свойства находились непосредственно на объекте, например так:

box.prop1
box.prop2
box.prop3

Я знаю, что мог бы сделать что-то вроде этого:

function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}

Но это нехорошо, потому что тогда мой конструктор должен был бы «знать» перед именами свойств параметра объекта. Я хотел бы иметь возможность передавать различные объекты в качестве параметров и назначать их свойства непосредственно как свойства нового пользовательского объекта, созданного конструктором, поэтому я получаю box.propX, а не box.obj.propX. Надеюсь, я проясняю, может быть, я измеряю что-то очень очевидное, но я новичок, поэтому, пожалуйста, нужна ваша помощь!

Заранее спасибо.

Ответы [ 3 ]

22 голосов
/ 20 января 2011

Вы могли бы сделать это.Вероятно, есть и способ jquery ...

function Box(obj) {
  for (var fld in obj) {
    this[fld] = obj[fld];
  }
}

Вы можете включить тест для hasOwnProperty, если вы (я считаю глупо) расширенный объект

function Box(obj) {
   for (var fld in obj) {
     if (obj.hasOwnProperty(fld)) {
       this[fld] = obj[fld];
     }
   }
 }

Редактировать

Ах, ха!это jQuery.extend

Итак, способ jQuery:

function Box(obj) {
  $.extend(this, obj);
}
7 голосов
/ 20 января 2011

Просто поместите это в ваш конструктор

  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      this[prop] = obj[prop];
    }
  }
2 голосов
/ 05 февраля 2013

Вот пример с шаблоном модуля javascript:

var s,
NewsWidget = {

  settings: {
    numArticles: 5,
    articleList: $("#article-list"),
    moreButton: $("#more-button")
  },

  init: function(options) {
    this.settings = $.extend(this.settings, options);
    s = this.settings;
    this.bindUIActions();
  },

  bindUIActions: function() {
    s.moreButton.on("click", function() {
      NewsWidget.getMoreArticles(s.numArticles);
    });
  },

  getMoreArticles: function(numToGet) {
    // $.ajax or something
    // using numToGet as param
  }

};

$(function(){
  NewsWidget.init({
    numArticles: 6
  });

  console.log(s.numArticles);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...