Tag: 原型inheritance

为什么把方法放在类的原型而不是在构造函数中声明呢?

我想了解更多关于原型inheritance,我有点混淆添加方法的原型和添加到实例之间的差异。 我为什么要做另一个呢? 原型方法: function Foo() {} Foo.prototype.doBar = console.log.bind(console, 'Did bar!'); var foo = new Foo(); foo.doBar(); // prints "Did bar!" 实例方法: function Foo() { this.doBar = console.log.bind(console, 'Did bar!'); } var foo = new Foo(); foo.doBar(); // prints "Did bar!" 把我的方法放在原型上有什么好处? 是否有一段时间通过构造函数声明实例上的方法更有意义?

通过调用祖先函数来inheritanceJavaScript

我正在试验(对我来说)一种新型的inheritance。 我想通过一个参数来调用inheritance的函数,这个参数决定了哪个inheritance对象被返回。 下面是一个例子来说明我的意思: function Localizor(type) { this.language = "English" this.endonym = "English" if (window[type]) { return new window[type]() } } Localizor.prototype.native = function native() { return "I speak " + this.endonym } Localizor.prototype.english = function () { return "I speak " + this.language } function French () { this.language = "French"; this.endonym = "français" } […]

水线ORM的inheritance

水线ORM是否支持inheritance? 比方说,我有一个名为BusinessDocument的模型,我想创build一个名为SalesOrder的新模型来扩展BusinessDocument 。 所以, SalesOrder最终应该具有BusinessDocument所有属性以及一些新的属性。 这是由水线支持吗?

Javascript:如何获取对象的原型链构造函数名称的列表?

我最近遇到一个有趣的问题。 我正在开发一些现有的代码,无论好坏,通常有几个级别的原型inheritance结束于各种各样的对象的构造函数。 其中每一个最终都从一个基础“类”inheritance。 每个构造函数遵循以下inheritance模式,其中Sub是子类, Super是直接原型: function Sub(/*args*/) { Super.call(this,/*args*/); } Sub.prototype = Object.create(Super.prototype); 这种模式一直延续到单个基类。 发现这对于我们的需要来说是非常有益的,为每个对象在原型链上存储一个构造函数名称列表,我为基类提供了以下代码,它使用了arguments对象的callee和caller属性: var curConstructor = arguments.callee; this.constructorList = [curConstructor.name]; while(curConstructor.caller && curConstructor.caller.name !== ''){ curConstructor = curConstructor.caller; this.constructorList.push(curConstructor.name); } 与此相关的主要问题是, 只有当对象是在匿名函数(或全局作用域)内部构造的时候才有效。 例如,假设我有一个构造函数SubA1与原型SubA与原型Base ,如果我这样做: function() { var aOk = new SubA1(); function oops() { var aNotOk = new SubA1(); } oops(); } aOk的构造函数列表是: […]

在node.js绑定中实现inheritance

我正在编写一个C ++库的Node.js绑定。 我可以识别C ++库中的关键对象,我可以将其公开为Node.js(即ObjectWrap的派生类)的类。 我也可以看到这些对象之间的inheritance关系。 如何将ClassA , ClassB , ClassC为node.js类( ObjectWrap衍生物)并操作它们的原型(在V8 C ++代码中),以便ClassB和ClassC是ClassA衍生物?

`util.inherits`和在NodeJS中扩展原型的区别

我从0.11 / 0.12开始一直在使用Node,所以如果这是晚会来得晚的话,请纠正我。 我想了解使用util.inherits(Son, Dad)和简单地扩展Son.prototype = [new] Dad()的原型之间的Son.prototype = [new] Dad() 。 对于这个例子,我首先使用util.inherits了一个Transformstream : var util = require('util') var Transform = require('stream').Transform util.inherits(TStream, Transform) function TStream () { Transform.call(this) } TStream.prototype._transform = function(chunk, encoding, done) { this.push(/* transform chunk! */) done() } process.stdin.pipe(new TStream()).pipe(process.stdout) 以上似乎是Node中最常用的方法。 以下(扩展原型)的工作方式(貌似)也很简单: function TStream() {} TStream.prototype = require("stream").Transform() TStream.prototype._transform = function […]

Node.js EventEmitter和多层次的inheritance

我试图找出使用Node.js EventEmitter类时多级inheritance的最佳方法。 设置是我正在开发一个MVC框架的Node.js使用控制器,可以有基地控制器,但控制器可以发出的事件也发出同样的事件在其基本控制器。 到目前为止我有: var events = require('events'); var util = require('util'); var Controller = function() { }; util.inherits(Controller, events.EventEmitter); var baseController = new Controller(); baseController.on('request', function() { console.log('Calling request event on baseController'); }); var homeController = new Controller(); homeController.prototype = baseController; homeController.on('request', function() { console.log('Calling request event on homeController'); }); homeController.emit('request'); …但是只输出“ homeController上的调用请求事件 ”,我希望这两个“请求”事件触发。 […]

使用Node.js,Handlebars和Express进行模板inheritance

我刚开始使用Node.js,所以我构build了非常简单的应用程序来练习基础知识。 我试图得到一些像Django一样的模板inheritance工作,但是我在如何做到这一点上有些遗憾。 我明白,图书馆的“expression手柄”包括布局的概念,我认为这可能是最好的办法,但乍一看,我不知道它是否允许一步以上的inheritance,或者使用它来replace不同的块(我看到了一个总体布局,其中插入了其他模板来代替{{{body}}}标记,尽pipe可能有更多的技巧)。 所以,我的问题是:如何实现一个多层模板的inheritance(也有儿童插入不同的独立块,而不是一个单一的内容)? 我正在使用Node.js,Express和句柄,但如果后两者不可能,我不介意尝试其他框架或模板语言。 谢谢! 编辑: 我的意思是伪代码的例子: 首先,我们可以有一个共同的外部模板: <html> <head></head> <body> <h1> Main Title </h1> <h2> {{section name block}} </h2> <h3> {{subsection name block}} </h3> {{content block}} </body> </html> 然后是另一个(中间模板),replace外部块的一些(可能会添加其他块): {{inheriting from outer template}} {{section name block}} Section Three {{/block}} 最后是一个内部的,这将是从JavaScript代码调用的一个: {{inheriting from middle template}} {{subsection name block}} Subsection Two {{/block}} {{content block}} <p>This […]

复杂的循环Node模块依赖抛出“TypeError:”inheritance“的超级构造函数必须有一个原型”

我有一个复杂的Node SDK项目,它使用一些类inheritance来尝试和static-ify Javascript。 我正在使用Node的模块caching行为来为SDK( Project类, ProjectClient的共享实例)创build一个类似于单例的行为。 初始化,它看起来像这样: var Project = require('./project'), Project.init(params) // Project is now an instance of ProjectClient 我也有一些数据对象types的类: Entity (一个标准的parsingJSON有效载荷对象)和User (包含用户属性的特殊types的实体)。 ProjectClient类有几个允许RESTful API调用发生的方法,例如Project.GET() , Project.PUT() 。 实例化Project “singleton”时,这些工作很好。 我现在正在试图创build一个方便的方法附加到Entity ,将利用ProjectClient的RESTful操作,例如Entity.save() , Entity.refresh() 。 当我尝试将Project导入Entity : var Project = require('../project') 我得到: TypeError: The super constructor to `inherits` must have a prototype. at Object.exports.inherits […]

Javascript可写描述符是否阻止实例的更改?

答案 (请在下面阅读,他们各自的作者提供了有价值的见解): “writable:false”可以防止分配一个新的值, 但 Object.defineProperty不是一个分配操作,因此忽略“可写” 属性属性是inheritance的,因此一个属性在每个子类/实例上将保持不可写,直到一个子类(或子类的实例)将“writable”的值更改为true 问题 : 有关属性“可写”描述符的MDN文档声明: 当且仅当与属性相关联的值可能被赋值运算符改变时才为真。 默认为false。 官方的ECMA-262第6版或多或less陈述相同。 意思很清楚,但就我的理解而言,它仅限于原始财产(即该特定对象的财产) 不过,请考虑下面的例子( JSFiddle ): //works as expected, overloading complete var Parent = function() {}; Object.defineProperty(Parent.prototype, "answer", { value: function() { return 42; } }); var Child = function() {}; Child.prototype = Object.create(Parent.prototype, { answer: { value: function() { return 0; } } }); […]