如何为自己分配参数属性?

时间:2015-06-09 08:17:26

标签: javascript node.js

目标

我的目标是模仿Mongoose模型" class"使用内存存储。以下是可能的示例:

var Book = require("./book");
var book = new Book({
  title: "Hello"
});

现在,当我将book传递给console.log时,会返回以下输出:

console.log(book); // returns { title: "Hello" }

问题

我创建了一个名为MyBook的函数来模拟Mongoose模型" class":

function MyBook(doc) {
  this.doc = doc;
}
var book = new MyBook({title: "Hello"});

但是当我将book传递给console.log时,输出结果不同:

console.log(book); // returns { doc: { title: "Hello" } }

这对我有意义。我正在分配给doc所以我有一个属性doc是有意义的。但这不是我想要的。我想要的是一个像Mongoose回归的输出。我分配给doc因为,当我分配给this时:

function MyBook(doc) {
  this = doc;
}

我收到此错误:

ReferenceError: Invalid left-hand side in assignment

同样,这对我来说很有意义。但问题仍然存在:如何(动态)将给定参数的属性分配给当前对象?

3 个答案:

答案 0 :(得分:4)

您可以使用doc循环遍历for...in的所有属性:

function MyBook(doc) {
  for (var property in doc) {
    if (doc.hasOwnProperty(property)) {
      this[property] = doc[property];
    }
  }
}

var book = new MyBook({title: "Hello"});

很快你就能完成Object.assign(this, doc)

答案 1 :(得分:2)

您可以使用extend模块中的util函数将传递的参数与自this个对象合并

var extend = require('util')._extend
;

var MyBook = function(options) {
    extend(this, options);
};

答案 2 :(得分:0)

您可以使用JavaScripts参数对象。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments

function MyBook() {
    this.title = arguments[0];
    this.other = arguments[1]
}
var book = new MyBook("Hello", "Other");
console.log(book); // returns - MyBook {title: "Hello", other: "Other"}    

虽然这样做,但您需要在MyBook上设置所需的属性。这并不真正匹配您所寻找的“动态”元素,但确实符合您的目标,即“类”的想法