Javascript实现对象的创建
能使用{}创建对象就不要使用new Object,能使用[]创建数组就不要使用new Array,JS中字面量的访问速度要高于对象。
1、通过object构造函数创建单个对象
var o = new Object(); o.name = 'camille'; o.age = 24; o.getName = function() { return '我的名字是:'+ this.name; }; o.getAge = function() { return '我的年龄是:' + this.age; };
2、通过对象字面量创建单个对象,JSON(常用)
var personObj = { name: 'camille', age: 25, getName: function(){ return '我的名字是:'+ this.name; }, getAge: function(){ return '我的年龄是:' + this.age; } } personObj.getAge();
使用同一个接口创建很多对象,会产生大量的重复代码。
3、稳妥构造函数模式
所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this的对象。
function Person(name, age) { var o = new Object(); o.getName = function() { return '我的名字是:'+ name; }; o.getAge = function() { return '我的年龄是:' + age; }; return o; } var nobj = Person('camille',25); console.log(nobj.getAge());
与寄生构造函数模式类似,使用稳妥构造函数模式创建的对象与构造函数之间没有什么关系,因此instanceof操作符对这种对象也没有意义。
4、工厂模式:带参数的函数,返回对象,流水线工作。在函数内定义对象,并定义对象的各种属性,虽然属性可以是方法,但是建议在函数外定义属性为方法的属性,这样可以避免重复创建该方法。解决了创建多个相似对象的问题,但却没有解决对象识别的问题。
function Person(name, age) { var o= new Object(); o.name = name; o.age = age; o.getName = function() { return '我的名字是:'+ this.name; }; o.getAge = function() { return '我的年龄是:' + this.age; }; return o; } var nobj = Person('camille',25); console.log(nobj.getAge());
5、寄生构造函数模式
创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后在返回创建对象。
function Person(name, age) { var o = new Object(); o.name = name; o.age = age; o.getName = function() { return '我的名字是:'+ this.name; }; o.getAge = function() { return '我的年龄是:' + this.age; }; return o; } var nobj = new Person('camille',25); console.log(nobj.getAge());
返回的对象与构造函数或者与构造函数的原型之间没有关系,也就是说,构造函数返回的对象与在构造函数外部创建的对象没什么不同。为此,不能依赖instanceof操作符来确定对象的类型。由于存在这一问题,我们建议在可以使用其他模式的情况下不要使用这种模式。
6、构造函数模式:没有显式的创建对象,直接将属性和方法赋给了this对象,没有return语句;创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型。每个方法都要在每个实例上重新创建一遍。
function Person(name, age) { this.name = name; this.age = age; this.getName = function() { return '我的名字是:'+ this.name; }; this.getAge = function() { return '我的年龄是:' + this.age; }; } var nobj = new Person('camille',25); console.log(nobj.getAge());
注意!如果不加new关键字,Person就不是构造函数,会意外地给它的外部作用域即window添加属性,为了安全,这里的new是必须的。
7、原型模式:属性没有在函数内定义,而是利用prototype属性对属性进行定义。所有的属性,方法都是共享的,不能让对象具体化。实例中的指针仅指向原型,而不指向构造函数。
//写法1 function Person() { } Person.prototype.name = 'camille'; Person.prototype.age = 26; Person.prototype.getName = function() { return '我的名字是:'+ this.name; }; Person.prototype.getAge = function() { return '我的年龄是:' + this.age; }; var nobj = new Person(); console.log(nobj.getAge());
//写法2 function Person() { } Person.prototype = { constructor: Person,//必须手动设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。 name: 'camille', age: 26, getName: function() { return '我的名字是:'+ this.name; }, getAge: function() { return '我的年龄是:' + this.age; } }; var nobj = new Person(); console.log(nobj.getAge());
8、构造-原型组合模式(推荐)
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。
//写法1 function Person(name, age) { this.name = name; this.age = age; } Person.prototype.getName = function() { return '我的名字是:'+ this.name; }; Person.prototype.getAge = function() { return '我的年龄是:' + this.age; }; var nobj = new Person('camille',25); console.log(nobj.getAge());
//写法2 function Person(name, age) { this.name = name; this.age = age; } /** * 为了让属性和方法更好的体现封装的效果,减少不必要的输入,原型的创建可以使用字面量方式 */ Person.prototype = { constructor: Person,//必须手动设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。 getName: function() { return '我的名字是:'+ this.name; }, getAge: function() { return '我的年龄是:' + this.age; } }; var nobj = new Person('camille',25); console.log(nobj.getAge());
//写法3 function Person(name, age) { this.name = name; this.age = age; } (function() { this.getName = function() { return '我的名字是:'+ this.name; }; this.getAge = function() { return '我的年龄是:' + this.age; }; }).call(Person.prototype); var nobj = new Person('camille',25); console.log(nobj.getAge());
9、动态原型模式:可以理解为构造-原型组合模式的一个特例,在函数内定义属性为方法的属性,if语句保证创建该对象的实例时,属性的方法不会被重复创建。(推荐)
function Person(name, age) { this.name = name; this.age = age; if (typeof this.getName != "function") { //使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,就会切断现有实例与新原型之间的联系 Person.prototype.getName = function () { alert(this.name); } } }
通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。
Javascript实现对象的创建的更多相关文章
- JavaScript面向对象—对象的创建和操作
JavaScript面向对象-对象的创建和操作 前言 虽然说在JavaScript编程语言中,函数是第一公民,但是JavaScript不仅支持函数式编程,也支持面向对象编程.JavaScript对象设 ...
- JavaScript(对象的创建模式)
JavaScript和其他语言略有不同,在JavaScript中,引用数据类型都是对象(包括函数).不过,在JavaScript中并没有“类”的概念,这决定了在JavaScript中不能直接来定义“类 ...
- Javascript之对象的创建
面向对象语言有一个非常显著的标志,那就是它们都有类的概念,通过类之间的继承就可以达到任意创建具有相同属性方法的对象.而在ECMAScript中并没有类的概念,它把对象定义为:无序属性的集合,其属性包含 ...
- JavaScript原生对象及扩展
来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始 ...
- 《JavaScript高级程序设计》读书笔记--(4)对象的创建
ECMAScript支持面向对象(OO)编程,但不使用类或者接口.对象可以在代码执行过程中创建或增强,因此具有动态性而非严格定义的实体.在没有类的情况下,可以采用下列模式创建对象. 对象的创建 工厂模 ...
- JavaScript对象的创建之使用json格式定义
json: javascript simple object notation. json就是js的对象,但是它省去了xml中的标签,而是通过{}来完成对象的说明. 定义对象 var person = ...
- javascript中对象的不同创建方法
javascript中的对象与一般的面向对象的程序设计语言(c++,Java等)不同,甚至很少有人说它是面向对象的程序设计语言,因为它没有类.javaScript只有对象,不是类的实例.javascr ...
- javascript对象的创建--相对java 怎样去创建了"类"i以及实例化对象
由于javascript没有java那么多基本类型,同时也没有提供class这个东西,那么我们想实现javascript的对象创建应该怎么办呢,我简单地从w3c提供的课件中提取了一下几种方法: 一.工 ...
- Javascript我学之五对象的创建与使用
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 对象的创建 JavaScript对象有两种类型 1).Native:在ECMAScript标准中定义和描述,包括JavaScript内置 ...
随机推荐
- java的一维数组
数组的基础知识: 数组一旦创建,它的的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 初始化数组的方法: 复制数组的方法: 1.使用循环语句逐个地复制数组的元素 2.使用System ...
- Informatic学习总结_day03_update组件学习
- AT91RM9200---SMC简介
1.前言 SMC(Static Memory Controller)Atmel 9200静态存储控制器的简称,它可以产生信号来控制外部静态存储和外设.SMC可通过编程寄存器来进行配置. 它有8路片选和 ...
- Android APP—— 开发入门教程
一.SDK下载 下载:adt-bundle-windows-x86_64-20140702.zip(20140702 已经是最后版本了) 解压出来如下: 点击Eclipse安装 创建一个新的工作空间安 ...
- Javascript构造函数的继承
仅供学习参考,原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 今天要介绍 ...
- Android网络通信(7):NFC
Android网络通信之 NFC NFC:近场通信,是一种超近距离的无线通信技术.Android从2.3版本的SDK开始支持基于NFC通信.基于NFC的识别和通信可分为三个步骤:1.Android通过 ...
- 1. let 和 const 命令
一.简单认识 1. 用let来声明变量,变量作用域就在{}(块级作用域)中 2. 用const声明变量,变量值不可更改 3. 增加了let以后,在声明变量时应该多考虑一下变量的用途,是否希望只在当前代 ...
- OCM_第十七天课程:Section7 —》GI 及 ASM 安装配置 _管理和配置 GRID /实施 ASM 故障组 /创建 ACFS 文件系统
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- C++ Primer读书笔记(1)
指针和引用 引用本身不是一个对象,因此不能定义引用的指针:而指针是一个对象,因此可以定义指针的引用. 此外,要理解一个复合类型的变量到底是什么类型,最简单的办法是从右向左阅读其定义,离变量名最近的符号 ...
- VeeValidate配置中文的两种方法
使用VeeValidate时遇到的问题,下面是我找到的一些解决办法: VeeValidate一直报错早不到addlocale方法 解决办法:1.卸载掉当前版本,重新安装低版本如2.0.0-rc.25 ...