如何在ES6中动态创建/生成原型对象?

时间:2015-10-24 02:02:54

标签: javascript model ecmascript-6

在backbone&#j; js中有一个模型对象,您可以在其中设置属性并扩展函数,并返回一个可以使用的新原型。

见第一个例子:

var Human = Backbone.Model.extend({
    initialize: function(){
        alert("Welcome to this world");
    }
});

var human = new Human();

来源:https://cdnjs.com/libraries/backbone.js/tutorials/what-is-a-model

我试图在ES6中实现这一目标,但缺乏对javascript原型的深入理解。

我写了一些允许这样的内容:

var Model = {
    foo() {
        return 'bar';
    },
    extend(object) {
        var Extend = function() {

            // Set prototype's schema
            this.schema = object.schema;

            // Inherit model's functions
            this.foo = Model.foo;
        }
        return Extend;
    }
}

// Extend model and create a new prototype
var Human = Mode.extend({
    schema: {
        name: 'string',
        age:  'number'
    }
});

var human1 = new Human();
var human2 = new Human();

console.log( human1.foo() ); // bar
console.log( human1.schema ); // { name: 'string', age: 'number' }
console.log( human2.schema ); // { name: 'string', age: 'number' }

我想使用这样的概念来实现backbone.js在es6中实现的目标。有没有更好的方法呢?

编辑: 对不起,我应该澄清,我需要它是原型的向后兼容性。这将是一个小型库,您不需要使用ES6或类。我只想在es6中编写库。该库的用户应该能够通过扩展函数构建新的模型原型。

2 个答案:

答案 0 :(得分:1)

ECMAScript 6(a.k.a. ECMAScript 2015)引入了一种类定义语法,它与其他OOP类结构非常相似,它们提供了继承和对基类对象的轻松访问。

然而,引入的JavaScript类是引用MDN website"语法糖而不是JavaScript现有的基于原型的继承。类语法没有向JavaScript引入新的面向对象的继承模型。 JavaScript类为创建对象和处理继承提供了更简单,更清晰的语法。"

在我看来,这一点都非常受欢迎 - 语法糖与否。

目前最大的问题是缺乏支持的浏览器。但如果您致力于利用E6,那么您应该研究这种新语法。

MDN网站也有大量有关原型继承的信息。

答案 1 :(得分:0)

如果它的ES6然后使用类

class Alien {
    constructor(type) {
        this.type = type;
    }
    role() {
        if (this.type === "Evil") {
            console.log("To destroy the earth and enslave the humans");
        } else {
            console.log("To make crop circles and appear in blurry tabloid photos.");
        }
    }
}

class SciFi extends Alien {
    role() {
        if (this.type === "Evil") {
            console.log("To destroy the rebel alliance.");
        } else {
            console.log("To phone home.");
        }
    }
}