什么是与PHP特征相当的nodejs

时间:2018-05-15 06:51:07

标签: node.js stampit.js

在PHP中,我使用了特征,之前是一种分离出可重用代码的好方法。通常使事情更具可读性。

这是一个具体的例子:(特征和类可以在单独的文件中)。我怎么能在nodejs中做到这一点?

<?php

trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
    ..more functions..
}

class TheWorld {
    use HelloWorld;
}

$o = new TheWorldIsNotEnough();
$o->sayHello();

?>

在Nodejs中,我看过Stampit看起来很受欢迎,但肯定有一种简单的方法可以在一个漂亮的OOP&amp;在不依赖于包的情况下使nodejs更具可读性?

谢谢你的时间!

2 个答案:

答案 0 :(得分:5)

在JavaScript中,您可以将任何函数用作特征方法

function sayHello() {
	console.log("Hello " + this.me + "!");
}

class TheWorld {
	constructor() {
		this.me = 'world';
	}
}

TheWorld.prototype.sayHello = sayHello;
var o = new TheWorld();
o.sayHello();

或纯原型版

//trait
function sayHello() {
	console.log("Hello " + this.me + "!");
}

function TheWorld() {
	this.me = "world";
}

TheWorld.prototype.sayHello = sayHello;
var o = new TheWorld();
o.sayHello();

您甚至可以创建将特征应用于类

的函数

//trait object
var trait = {
	sayHello: function () {
		console.log("Hello " + this.me + "!");
	},
  sayBye: function () {
		console.log("Bye " + this.me + "!");
	}
};

function applyTrait(destClass, trait) {
	Object.keys(trait).forEach(function (name) {
		destClass.prototype[name] = trait[name];
	});
}

function TheWorld() {
	this.me = "world";
}

applyTrait(TheWorld, trait);
// or simply
Object.assign(TheWorld.prototype, trait);
var o = new TheWorld();
o.sayHello();
o.sayBye();

答案 1 :(得分:0)

有NPM模块:https://www.npmjs.com/package/traits.js

自述文件中的代码示例:

var EnumerableTrait = Trait({
  each: Trait.required, // should be provided by the composite
  map: function(fun) { var r = []; this.each(function (e) { r.push(fun(e)); }); return r; },
  inject: function(init, accum) { var r = init; this.each(function (e) { r = accum(r,e); }); return r; },
  ...
});

function Range(from, to) {
  return Trait.create(
    Object.prototype,
    Trait.compose(
      EnumerableTrait,
      Trait({
        each: function(fun) { for (var i = from; i < to; i++) { fun(i); } }
      })));
}

var r = Range(0,5);
r.inject(0,function(a,b){return a+b;}); // 10