1、new 操作符 + Object 创建对象

var person = new Object();
person.name = "lisi";
person.age = 21;
person.family = ["lida","lier","wangwu"];
person.say = function(){
alert(this.name);
}

2、字面式创建对象

var person ={
name: "lisi",
age: 21,
family: ["lida","lier","wangwu"],
say: function(){
alert(this.name);
}
};

以上两种方法在使用同一接口创建多个对象时,会产生大量重复代码,为了解决此问题,工厂模式被开发。

3、工厂模式

function createPerson(name,age,family) {
var o = new Object();
o.name = name;
o.age = age;
o.family = family;
o.say = function(){
alert(this.name);
}
return o;
} var person1 = createPerson("lisi",21,["lida","lier","wangwu"]); //instanceof无法判断它是谁的实例,只能判断他是对象,构造函数都可以判断出
var person2 = createPerson("wangwu",18,["lida","lier","lisi"]);
console.log(person1 instanceof Object); //true

工厂模式解决了重复实例化多个对象的问题,但没有解决对象识别的问题(但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,本例中,得到的都是o对象,对象的类型都是Object,因此出现了构造函数模式)。

4、构造函数模式

function Person(name,age,family) {
this.name = name;
this.age = age;
this.family = family;
this.say = function(){
alert(this.name);
}
}
var person1 = new Person("lisi",21,["lida","lier","wangwu"]);
var person2 = new Person("lisi",21,["lida","lier","lisi"]);
console.log(person1 instanceof Object); //true
console.log(person1 instanceof Person); //true
console.log(person2 instanceof Object); //true
console.log(person2 instanceof Person); //true
console.log(person1.constructor); //constructor 属性返回对创建此对象的数组、函数的引用

对比工厂模式有以下不同之处:

1、没有显式地创建对象

2、直接将属性和方法赋给了 this 对象

3、没有 return 语句

以此方法调用构造函数步骤:

1、创建一个新对象

2、将构造函数的作用域赋给新对象(将this指向这个新对象)

3、执行构造函数代码(为这个新对象添加属性)

4、返回新对象 ( 指针赋给变量person ??? )

可以看出,构造函数知道自己从哪里来(通过 instanceof 可以看出其既是Object的实例,又是Person的实例)

构造函数也有其缺陷,每个实例都包含不同的Function实例( 构造函数内的方法在做同一件事,但是实例化后却产生了不同的对象,方法是函数 ,函数也是对象)

因此产生了原型模式

5、原型模式

function Person() {
} Person.prototype.name = "lisi";
Person.prototype.age = 21;
Person.prototype.family = ["lida","lier","wangwu"];
Person.prototype.say = function(){
alert(this.name);
};
console.log(Person.prototype); //Object{name: 'lisi', age: 21, family: Array[3]} var person1 = new Person(); //创建一个实例person1
console.log(person1.name); //lisi var person2 = new Person(); //创建实例person2
person2.name = "wangwu";
person2.family = ["lida","lier","lisi"];
console.log(person2); //Person {name: "wangwu", family: Array[3]}
// console.log(person2.prototype.name); //报错
console.log(person2.age); //

原型模式的好处是所有对象实例共享它的属性和方法(即所谓的共有属性),此外还可以如代码第16,17行那样设置实例自己的属性(方法)(即所谓的私有属性),可以覆盖原型对象上的同名属性(方法)。

6、混合模式(构造函数模式+原型模式)

构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性

function Person(name,age,family){
this.name = name;
this.age = age;
this.family = family;
} Person.prototype = {
constructor: Person, //每个函数都有prototype属性,指向该函数原型对象,原型对象都有constructor属性,这是一个指向prototype属性所在函数的指针
say: function(){
alert(this.name);
}
} var person1 = new Person("lisi",21,["lida","lier","wangwu"]);
console.log(person1);
var person2 = new Person("wangwu",21,["lida","lier","lisi"]);
console.log(person2);

可以看出,混合模式共享着对相同方法的引用,又保证了每个实例有自己的私有属性。最大限度的节省了内存。

高程中还提到了动态原型模式,寄生构造函数模式,稳妥构造函数模式。

最新文章

  1. 工厂方法模式——创建型模式02
  2. CSS的两大重点
  3. 习题: codevs 2492 上帝造题的七分钟2 解题报告
  4. Xcode 7中http通信出现如下错误:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
  5. Redis过期时间
  6. find 忽略文件夹选项-prune的说明
  7. 简单易懂的现代魔法——Play Framework攻略4
  8. 认识html标签
  9. StormAPI简单使用
  10. tomcat无法正常启动的一个原因
  11. Android SurfaceView实战 带你玩转flabby bird (上)
  12. CSS左侧固定宽 右侧自适应(兼容所有浏览器)
  13. CF #244 D. Match & Catch 后缀数组
  14. 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)
  15. 201521123112《Java程序设计》第7周学习总结
  16. Koa与Node.js开发实战(3)——Nunjucks模板在Koa中的应用(视频演示)
  17. 数据结构 - 表插入排序 具体解释 及 代码(C++)
  18. java xml 转 json
  19. centos 7.4 安装gitlab
  20. Thinkphp5.1 模板路径报错

热门文章

  1. Java后端技术面试汇总(第三套)
  2. vscode 格式化vue代码单引号变双引号
  3. EJS学习(五)之EJS的CommonJs规范版本
  4. php enum 数字类型插入失败的解决办法
  5. yii的rules验证规则
  6. resulting in duplicate entry '1' for key 'primary'
  7. 使用python的selenium库刷超星网课
  8. xml_dom解析
  9. linux命令详解——which
  10. 韦东山嵌入式Linux学习笔记08--中断体系结构