专栏首页悠扬前奏的博客JavaScript设计模式(1)——Constructor(构造器)模式

JavaScript设计模式(1)——Constructor(构造器)模式

0. Constructor(构造器)模式

在面向对象中,Constructor是一种在内存已经分配给该对象的情况下,用于初始化新创建对象的特殊方法。在JavaScript中,通常用object构造器。

Object构造器用于创建特定类型的对象——准备好对象以备使用。 接受构造器可以使用的参数,以在第一次创建对象时,设置成员变量和方法的值。

1.对象创建

1.1 JavaScript创建对象一般用如下两种方法:

// 创建空对象

var newObject1 = {};

// Object构造器
var newObject2 = new Object();

1.2 对象赋值 对象赋值一般有四种方法:

// 1."点"语法

// 设置属性
newObject.someKey = "asd";

//获取属性
var key = newObject.someKey;

// 2.中括号

//设置属性
newObject["someKey"] = "asd";

//获取属性
var key = newObject["someKey"];

// 3.Object.defineProperty

//设置属性
Object.defineProperty(newObject, "someKey", {
    value:"for more control of the property's behavior",
    writable: true,
    enumerable: true,
    econfigurable: true
});

// 简化
var defineProp = function(obj, key, value){
    config.value = value;
    Object.defineProperty(obj,key,config);
}

// e.g.
var person Object.create(null);
defineProp(person, "car", "myCar");
defineProp(person, "birth", "asd");
defineProp(person, "hasBeard", false);

// 4.Object.defineProperties

// 设置属性
Object.defineProperties(newObject, {
    "someKey":{
        value:"asd",
        writable: true
    },
    "anotherKey": {
        value:"qwe",
        writable: true
    }
});

1.3 继承 这些方法甚至是可以用于继承的

// 创建司机对象继承于person对象
var driver = Object.create(person);

// 设置司机的属性
defineProp(driver, "speed", "100kmh");

// 获取继承的属性
console.log(driver.birth);

// 获取新属性
console.log(driver.speed);

2. 基本Constructor(构造器)

通过在构造器前面加new关键字,实例化新对象,该对象成员由该函数定义。 在构造器内部,关键字this引用新创建的对象。

function Car(model, year, miles){
    this.model = model;
    this.year = year;
    this.miles = miles;
    this.toString = function(){
        return this.model + "has done" + this.miles + "miles";
    }
}

//创建实例
var c1= new Car("car1", "2016", 20000);
var c2 = new Car("car2", "2017", 1500);

//调用toString()查看输出
console.log(c1.toString());
console.log(c2.toString());

基本构造器存在一些问题,包括:

  • 继承困难
  • 其中的函数(比如toString)是为每个用Car构造器创建的新对象分别重新定义的,应该实现共享。

3. 带原型的(prototype)的Constructor(构造器)

JavaScript中的prototype(原型)属性,可以让JavaScript构造器创建一个对象后,新对象拥有构造器原型的所有对象。 这样,前文示例变为:

function Car(model, year, miles){
    this.model = model;
    this.year = year;
    this.miles = miles;
};

Car.prototype.toString = function{
    return this.model + " has done " + this.miles + " miles";
};

//创建实例
var asd = new Car("car1", "2016", 20000);
var qwe = new Car("car2", "2017", 1500);

//调用toString()查看输出
console.log(asd.toString());
console.log(qwe.toString());

此时,toString()的单一实例就能在所有的Car对象中共享。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Groovy-11.注解

    一个方法可以有多个注解,此时可以定义一个元注解,将多个注解集中在一起,用AnnotationCollector来定义注释的集合:

    悠扬前奏
  • Spring Cloud-1.服务治理

    悠扬前奏
  • Groovy-18.模板引擎

    使用SimpleTemplateEngine类可以再模板中使用类似JSP的scriptlet和EL表达式,用来生成参数化文本。 模板引擎允许绑定参数列表以及值...

    悠扬前奏
  • 具有悬浮有效载荷的基于模型的元强化学习(CS RO)

    对于自动驾驶飞行器而言,运输悬浮的有效载荷具有挑战性,因为有效载荷会导致机器人动力学发生重大且不可预测的变化。 这些变化可能导致飞行性能欠佳甚至灾难性故障。 尽...

    时代在召唤
  • Object 中的几个很相似的方法

    这里主要讨论这么几个方法,他们用法很相似,但又有所不同。在实际开发中就有可能陷入其中,搞不清到底用哪个方法比较好。下面就开始一一介绍。

    多云转晴
  • 再不怕和老外聊天了!我用python写了个微信聊天翻译助手!

    在前面的一篇文章如何用python“优雅”的调用有道翻译?中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始。现在笔者又回来了。Te...

    bigsai
  • 【程序源代码】可把我自己给牛逼坏了

    两个月前全球著名的游戏开发公司EA在GitHub上,把《命令与征服》系列中的两个游戏的部分源码上传开源了,确确实实弄出了个大新闻!好多游戏开发者纷纷下载保存源码...

    程序源代码
  • Java程序员笔记—dubbo启动服务之容器(Container)

    SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来...

    慕容千语
  • 刷题利器 LeetCode

    IDEA整合LeetCode插件,可以在 IDEA 本地编辑代码并且运行提交,还能关联自己的账号,非常实用。

    Jacob丶
  • 享元模式

    享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。如果系...

    一粒小麦

扫码关注云+社区

领取腾讯云代金券