为什么Object.create没有在javascript中创建新对象

时间:2014-01-10 17:27:40

标签: javascript jquery knockout.js

我在项目中使用淘汰赛。我有以下代码的问题:

var viewModel = ko.mapping.fromJSON('@Html.Raw(Json.Encode(Model))');

        function viewModelCollection() {
            var self = this;

            self.types = ko.observableArray([viewModel]);

            self.add = function () {
                //issue is here, the copy of viewModel object is adding
                //here, instead of new object.
                self.types.push(Object.create(viewModel));
            };

            self.remove = function () {
                self.types.remove(this);
            };
        }

        ko.applyBindings(new viewModelCollection());

这里我通过映射插件从服务器获取一个空对象我创建了新的viewModel对象。我还创建了viewModelCollection,它具有viewModel和可观察的viewModel以及在该数组上运行的函数。

问题是当我在添加函数中添加新对象时,它不是添加新对象而是复制对象。因此,如果我在单个文本框中更改值,则会在所有文本框中更改。

为什么这一行没有创建新对象:

Object.create(viewModel);

任何想法??

3 个答案:

答案 0 :(得分:0)

您正在尝试在其自身内创建对象的新实例。 self.add是一个计算自身的变量,它不是一个匿名函数,因此在完全实例化viewModel之前对它进行求值。此时,如果你使用console.log(viewModel),它将返回null或undefined。

这将是你如何使用匿名函数在另一个视图模型中创建视图模型的实例

function viewModel() {
    var self = this;
    var something = ko.observable();
}

function parentviewModel() {
    var self = this;
    var types = ko.observableArray();
    types.push(Object.create(viewModel));
    types.push(new viewModel());
}

但这不起作用

var viewModel = function() {
    var self = this;
    var types = ko.observableArray();
    types.push(Object.create(viewModel));
    types.push(new viewModel());
}

答案 1 :(得分:0)

  1. 在对象副本和对象的新实例之间应用程序有什么区别?
  2. 为什么你认为它不起作用?检查__proto__字段以查找创建的对象 - 将有viewModel实例。 Object.create使用给定对象作为原型创建新对象。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

答案 2 :(得分:0)

当然是在复制对象。您告诉它复制viewmodel,这是您绑定的同一个对象。如果您想为每个副本提供新的副本,则需要保持原始副本的新鲜。最简单的方法是更改​​以下行

self.types = ko.observableArray([Object.create(viewModel)]);

现在放入数组的第一个是副本,add函数将继续复制原始文件,而不是您要绑定的文件。 See it in action here