Javascript es5中ES6方法(类)的等价物是什么?

Javascript es5中ES6方法(类)的等价物是什么?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我们如何将es6类方法聚合到ES5中 我正在读一本书,上面写着: class Ninja { constructor(name) { this.name = name; } swingSword() { return true; } } 与 function Ninja(name) { this.name = name; } Ninja.prototype.swingSword = function() {

我们如何将es6类方法聚合到ES5中

我正在读一本书,上面写着:

class Ninja {
    constructor(name) {
        this.name = name;
    }

    swingSword() {
        return true;
    }
}

function Ninja(name) {
    this.name = name;
} 

Ninja.prototype.swingSword = function() {
    return true;
};
我只是问为什么我们要在原型上添加swingSword而不是在构造函数中

因为函数应该在对象上,而不是在原型链上


我是对的还是错的?

应该在原型上,方法不是每个实例的数据。我想不出有哪种语言能以这种方式实现它,类的整体思想就是拥有一个拥有相同方法集的对象的整体类


如果将它放在构造函数函数中,那么它将是使用构造函数生成的每个实例的唯一函数。e、 g,1000个对象==1000个函数,每个“方法”。

仅将函数添加到对象只适用于
忍者。要创建扩展
Ninja
的类,例如
Kunoichi
,通常需要复制
Ninja
原型。不幸的是,由于原型中没有
swingSword
,您的
Kunoichi
无法挥剑

您必须在prototype中添加函数才能扩展类。


var $class = function ($superclass, config) {
    // All classes have a superclass with the root 
    // of this $class hierarchy being Object.
    var self = function (config) {
        // Object.assign or $.extend or ...
        config && Object.assign(this, config);
    };
    self.prototype = new $superclass(config);
    return self;
};

var A = $class(Object, {
    sayWhat: "Hello, I'm an A",
    say: function () {
        console.log(this.sayWhat);
    }
});

var B = $class(A, {
    sayWhat: "Hello, I'm a B"
});

var C = $class(B, {
    say: function () {
        console.log("C SAYS: " + this.sayWhat);
    },
    superSay: function () {
        // how to call a superclass method
        B.prototype.say.call(this);
    }
});

var a = new A();
a.say();  // Hello, I'm an A

var b = new B();
b.say();  // Hello, I'm a B

var c = new C();
c.say();  // C SAYS: Hello, I'm a B

// create a "one-off" object
var d = new C({
    sayWhat: "I'm special!",
    say: function () {
        console.log("hey!");
    }
});
d.say();  // hey!
d.superSay();  // I'm special!
C.prototype.say.call(d);  // C SAYS: I'm special!


你错了,这本书是对的。谢谢你的回答。现在我明白了。实际上,即使你在构造函数中附加函数,你也不会得到每1000个实例有1000个函数。最终得到1000个闭包和1个函数。闭包应该非常优化,所以它远没有创建1000个不同函数那么昂贵。另外,对于时间非常关键的方法,它们的运行速度可能更快(以较慢的对象创建速度为代价),因为Javascript引擎将首先检查this.func,然后检查object.getPrototypeOf(this.func)(依此类推)。但是是的,原型通常是最好的,并且维护更少。这段代码如何回答这个问题?看看如何写一个有用的答案。不要只是发布代码转储;您应该包含一些文本,解释代码的作用以及它如何回答问题。