我在node.js中有这段代码:
'use strict';
var Controller = require('../api/Controller');
var _Promise = require('bluebird');
var BookingController = function(model) {
Controller.call(this);
this.model = _Promise.promisifyAll(model);
};
BookingController.prototype = Object.create(Controller.prototype);
BookingController.prototype.constructor = BookingController;
module.exports = function(model) {
return new BookingController(model);
};
我使用Object.create
继承我SuperController
的所有方法,并且我使用Controller.call
从{this.model
继承BookingController
1}}在我的SuperController
,一切都好,基本的东西。
我想知道的是,如果可以达到与普通物体相同的效果,我会解释:
var SuperObject = {
printName: function() {
console.log(this.name);
}
};
var NormalObject = {
this.name = 'Amanda'
};
console.log(NormalObject.printName) // will print Amanda.
这可能吗?
这正是我正在做的原型继承,但我想做普通对象。
如果你们可以提供帮助,还有其他问题..
关于速度和性能,更好的用途,对象继承(如果可能)或原型继承?
谢谢!
答案 0 :(得分:0)
是的 - 原型继承完全是关于对象的!这些Controller
和BookingController
构造函数及其.prototype
属性仅在使用behind the scenes调用new keyword时模糊了Object.create
上的内容。
然而,你已经在幕后偷看了,正确使用psr-2 standard进行继承(基本的东西,如你所说:-D)。你似乎没有意识到你确实在这里使用了#34;普通对象"已经:BookingController.prototype
对象(实例将从中继承)继承自Controller.prototype
对象。
你可以和阿曼达做同样的事情:
var superObject = {
printName: function() {
console.log(this.name);
}
};
var normalObject = Object.create(superObject);
normalObject.name = 'Amanda';
console.log(normalObject.printName()) // Amanda
关于速度和性能,哪种更好用?
在要求表现之前,您应该使用更合适的方式。如果您只创建单个对象,它通常为Object.create
,如果您创建多个实例并且还需要初始化它们,则构造函数和new
是适当的工具。
毕竟两者都使用相同的原型继承。但是,特别是对于许多实例,JS引擎更擅长优化构造函数。虽然Gecko的Object.create
速度非常快,但在V8中Object.create
比new
呼叫慢得多。
答案 1 :(得分:-1)
JavaScript(ES5)没有"继承"内置于语言中。原型查找被称为"行为委托"。也许你从概念上知道这一点,但使用正确的术语非常重要。
如果您想要对该概念进行一些精彩的报道,请查看Kyle Simpson的开源书籍您不知道JavaScript 中的this chapter。
Object.create
是做你正在谈论的最佳实践方式。
ECMAScript 6 Classes
(MDN)有一个extends
关键字(MDN),看起来更像传统"继承"语法。