JavaScript学习笔记(二十九) method()方法

method()方法

JavaScript很可能让那些习惯了从类的角度思考的程序猿感动疑惑。这也是为什么一些程序猿选择让JavaScript更类一些(class-like)。
其中一种尝试就是method()方法,这种方法让JavaScript更class-like的方法不是一个被推荐的方式,然而它是一种有趣的模式,并且你可能在一些程序中无意间碰到过。

使用构造方法看起来就像在Java中使用类一样,他们能让你在构造方法中给this添加实例属性(instance properties)。
然而给this添加方法是低效的,因为它们最后在每个实例创建时都会被创新创建一次,这回消耗更多内存。这也是为什么复用的(reusable)方法应该被添加到构造方法的prototype属性。prototype在很多程序猿看起来就像外星人一样,那么你可以将它隐藏在一个方法背后.

使用method()方法去定义一个类型,看起来可能就像下面一样:
var Person = function (name) {
    this.name = name;
}.
    method('getName', function () {
        return this.name;
    }).
    method('setName', function (name) {
        this.name = name;
        return this;
    });
注意构造方法是如何链式调用方法method()的。
method()方法接受两个参数:
  • 新方法的名字
  • 方法的实现
这个新方法被添加给Person“类”,实现仅仅是另外一个函数,并且在实现函数的中,this指向Person创建的对象,就像你期望的一样。

接下来你可以使用Person()去创建一个新对象:
var a = new Person('Adam');
a.getName(); // 'Adam'
a.setName('Eve').getName(); // 'Eve'
再次注意链式模式的使用,因为setName()返回this变的可能。

最后,看一下method()函数是如何实现的:
if (typeof Function.prototype.method !== "function") {
    Function.prototype.method = function (name, implementation) {
        this.prototype[name] = implementation;
        return this;
    };
}
在这个实现中,首先尽职的做了一些检查,这个方法是否已经被实现了。
如果没有,我们继续将作为参数传递implementation函数添加给构造方法prototype的属性。
在这种情况下,this指向构造函数,构造函数的原型是可扩展的。





你可能感兴趣的:(JavaScript学习笔记(二十九) method()方法)