深入理解JavaScript系列(48):对象创建模式(下篇)

前端技术 2023/09/04 JavaScript

介绍

本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码。

模式6:函数语法糖

函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用prototype的特性,代码比较简单,我们先来看一下实现代码:

复制代码 代码如下:

if (typeof Function.prototype.method !== \"function\") {
    Function.prototype.method = function (name, implementation) {
        this.prototype[name] = implementation;
        return this;
    };
}

扩展对象的时候,可以这么用:
复制代码 代码如下:

var Person = function (name) {
    this.name = name;
}
.method(\'getName\',
            function () {
                return this.name;
            })
.method(\'setName\', function (name) {
    this.name = name;
    return this;
});

这样就给Person函数添加了getName和setName这2个方法,接下来我们来验证一下结果:
复制代码 代码如下:

var a = new Person(\'Adam\');
console.log(a.getName()); // \'Adam\'
console.log(a.setName(\'Eve\').getName()); // \'Eve\'

模式7:对象常量

对象常量是在一个对象提供set,get,ifDefined各种方法的体现,而且对于set的方法只会保留最先设置的对象,后期再设置都是无效的,已达到别人无法重载的目的。实现代码如下:

复制代码 代码如下:

var constant = (function () {
    var constants = {},
        ownProp = Object.prototype.hasOwnProperty,
    // 只允许设置这三种类型的值
        allowed = {
            string: 1,
            number: 1,
            boolean: 1
        },
        prefix = (Math.random() + \"_\").slice(2);

    return {
        // 设置名称为name的属性
        set: function (name, value) {
            if (this.isDefined(name)) {
                return false;
            }
            if (!ownProp.call(allowed, typeof value)) {
                return false;
            }
            constants[prefix + name] = value;
            return true;
        },
        // 判断是否存在名称为name的属性
        isDefined: function (name) {
            return ownProp.call(constants, prefix + name);
        },
        // 获取名称为name的属性
        get: function (name) {
            if (this.isDefined(name)) {
                return constants[prefix + name];
            }
            return null;
        }
    };
} ());

本文地址:https://www.stayed.cn/item/11572

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。