对象创建方法:

  1. 工厂方法
  2. 构造函数模式
  3. 原型模式
  4. 组合构造函数和原型模式
  5. 寄生构造函数模式
  6. 问题构造函数模式

工厂模式:

function Person(name, age){
var obj = new Object(); //创建对象 obj.name = name; //添加方法、属性
obj.age = age;
obj.sayName = function(){
alert(this.name);
} return obj; //返回对象
}
var people = Person("yangxunwu", 24);

缺点:返回的对象全部是object的实例,无法完成对象识别

构造函数模式:

function Person(name, age){
this.name = name; //添加方法、属性
this.age = age;
this.sayName = function(){
alert(this.name);
};
} var people = new Person("yangxunwu", 24);
//注意多了new操作

 构造函数创建实例时,必须用new操作符,经历四个步骤:

  1. 创建对象
  2. 将构造函数的作用域赋给对象。(this指向新对象)
  3. 执行构造函数代码。
  4. 返回新对象。

 缺点:虽然创建的实例可以通过instanceof操作符 来识别,但函数无法复用。

原型模式:

function Person(){                      //创建空的构造函数
} Person.prototype.age = age; //构造函数原型上添加属性和方法,达到函数复用
Person.prototype.sayName = function(){
alert(Person.prototype.name);
}; var people = new Person();

  当创建一个新函数时,会自动根据特定规则为函数创建prototype属性,这个属性是一个指针指向函数的原型对象,

原型对象会自动的获得一个constructor属性,这也是一个指针,指向拥有这个prototype属性的函数。

Pesson.prototype.constructor = Person

  创建自定义构造函数后,其原型对象自动获得constructor属性,其他的方法都从object继承。当通过构造函数创建

一个新实例后,实例自动获得一个指针,指向构造函数的原型对象,一般名称是__proto__属性。

  当代码读取某个属性时,一般会经过两个过程一个是在实例上搜索属性,搜索不到就通过__proto__属性到原型对象上搜索。

通过hasOwnProperty()方法,可以检测一个属性是存在实例中还是原型中,实例中返回true。

  原型对象上的属性可以让所有实例共享,但是当属性为引用类型时就会容易产生问题。

function Person(){
} Person.prototype.names = ["yang", "zhang"]; var people1 = new Person();
var people2 = new Person(); people1.names //["yang", "zhang"]
people2.names //["yang", "zhang"] people1.names.push("test"); //因为属性共享,而且是引用类型,所以names改变了 people1.names //["yang", "zhang", "test"]
people1.names //["yang", "zhang", "test"]

实例一般应该有自己的全部属性,这里没有

组合使用构造函数模式和原型模式

function Person(name, age){                //构造函数继承的属性是独有的
this.name = name;
this.age = age;
this.friends = ["yang", "zhang"];
} Person.prototype.sayName = function(){ //通过原型模式来共享方法
alert(this.name);
} //创建实例,实例不共享属性,共享方法
var people1 = new Person("yangxunwu", 24);
var people2 = new Person("hexiaoming", 6); //访问引用类型
people1.friends; //["yang", "zhang"]
people1.friends; //["yang", "zhang"] //为添加元素
people1.friends.push("wang"); people1.friends; //["yang", "zhang","wang"] 元素被添加到people1的属性中,因为构造函数不共享属性
people1.friends; //["yang", "zhang"] people1.sayName === people2.sayName //true。共享方法

动态原型模式:

function Person(name, age){                //动态原型模式
this.name = name;
this.age = age;
this.friends = ["yang", "zhang"]; if(Person.prototype.sayName != "function"){ //动态加载,只在第一次添加原型方法
Person.prototype.sayName = function(){
alert(this.name);
}
};
}

只在第一次调用构造函数时执行,之后原型已经完成初始化。

寄生构造函数模式:

function Person(name, age){
var obj = new Object(); //生成一个Objdetde对象 obj.name = name;
obj.age = age;
obj.sayName = functon(){
alert(this.name);
} return obj; //返回的一直是Object的对象。
} var people = new Person("yangxunwu", 24);    //与工厂模式的区别,坑
people.sayName(); //yangxunwu

返回的对象与构造函数或者构造函数的原型没关系,而且返回的一直是Object类型。只是把外部干的事放到内部干。

稳妥构造函数:

function Person(name, age){
var obj = new Object();
//定义私有变量和函数
obj.doSomething = function(){
alert(name); //定义可以访问私有变量和函数的方法,没有引用this
} return obj; //返回对象,现在只有这个对象可以访问这些私有变量和函数。
} var people = Person("yangxunwu", 24); //没使用new
people.sayName(); //yangxunwu

稳妥构造就是没有公共的属性,不引用this,防止数据被其他应用程序破坏。稳妥构造函数与寄生构造函数不同:

  1. 新创建的对象方法不引用this
  2. 不使用new操作符来调用构造函数。

Javascript高级程序设计——面向对象之创建对象的更多相关文章

  1. Javascript高级程序设计——面向对象小结

    ECMAScript支持面向对象编程,对象可以在代码执行时创建,具有动态扩展性而非严格意义上的实体. 创建对象方法: 工厂模式:简单的函数创建引用类型 构造函数模式:可以创建自定义引用类型,可以想创建 ...

  2. 2020/06/06 JavaScript高级程序设计 面向对象的程序设计

    ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...

  3. Javascript高级程序设计——面向对象之实现继承

    原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__.当实例查找方法时先在实例上找,找不到再通过__proto__到原 ...

  4. Javascript高级程序设计——面向对象之理解对象

    在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象.而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值.对象.或者函数. 在Ja ...

  5. 《Javascript高级程序设计》:创建对象

    工厂模式 function createPerson(name,age, job){ var o = new Object(); o.name = name; o.age = age; o.job = ...

  6. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

  7. 《JavaScript高级程序设计》学习笔记

    系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...

  8. 《Javascript高级程序设计》阅读记录(六):第六章 下

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...

  9. 《Javascript高级程序设计》阅读记录(五):第六章 上

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...

随机推荐

  1. Axure7.0中文汉化语言包下载 axure汉化包

    Axure RP Pro 7.0 正式版 (兼容 6 版) 简体中文语言包 支持 Axure RP Pro 正式版 当前最新版本 7.0.0.3142 废话不多说,直接给下载地址: Axure7.0中 ...

  2. 软件产品案例分析——K米

    第一部分 调研.评价 调研 测试机型:iPhone 6s K米版本:4.3.0 直观感受 界面干净,功能丰富,操作不复杂,易上手 错误类 无法分享KTV主页 步骤:进入KTV主页,点击右上角分享图标 ...

  3. 捉襟见肘之UIViewAnimationOptions

    [UIView animateWithDuration:duration delay:0.0f options:(curve << | UIViewAnimationOptionBegin ...

  4. SQL Server 2012 安装

    SQL Server 2012 安装过程很漫长, 里面很多界面不一一截取了,我分别在win7 企业版 64位 和 win10专业版SP1 64位 装了SQL Server 2012 ,都没有问题. 1 ...

  5. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. 三大WEB服务器对比分析(apache ,lighttpd,nginx)

    一.软件介绍(apache  lighttpd  nginx) 1. lighttpd Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.lighttpd是众多 ...

  7. Java 9.10习题

    <1>设计4个线程对象,两个线程执行减操作,两个线程执行加操作 //================================================= // File Na ...

  8. [Redis]如何通过Powershell创建Redis服务

    目前Redis在中国上线了,不过只是预览版而且不能通过Portal进行操作,不过可以通过Powershell创建,具体如下: 下载最新的Powershell SDK:http://www.window ...

  9. Linux下MySQL忘记密码

    系统:CentOS6.6 64位 参考文档(截图请看原网址): Linux下MySQL忘记root密码怎么办_百度经验 http://jingyan.baidu.com/article/1709ad8 ...

  10. C# 实现 Snowflake算法 ID生成

    http://blog.csdn.net/w200221626/article/details/52064976 C# 实现 Snowflake算法 /// <summary> /// 动 ...