原型继承与普通对象有可能吗?

时间:2015-08-08 18:26:56

标签: javascript inheritance

我在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.

这可能吗?

这正是我正在做的原型继承,但我想做普通对象。

如果你们可以提供帮助,还有其他问题..

关于速度和性能,更好的用途,对象继承(如果可能)或原型继承?

谢谢!

2 个答案:

答案 0 :(得分:0)

是的 - 原型继承完全是关于对象的!这些ControllerBookingController构造函数及其.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.createnew呼叫慢得多。

答案 1 :(得分:-1)

JavaScript(ES5)没有"继承"内置于语言中。原型查找被称为"行为委托"。也许你从概念上知道这一点,但使用正确的术语非常重要。

如果您想要对该概念进行一些精彩的报道,请查看Kyle Simpson的开源书籍您不知道JavaScript 中的this chapter

Object.create是做你正在谈论的最佳实践方式。

ECMAScript 6 Classes (MDN)有一个extends关键字(MDN),看起来更像传统"继承"语法。