javascript常用对象介绍:如何创建javascript对象
javascript常用对象介绍:如何创建javascript对象1、对象字面量var person = { firstName:"John" lastName:"Doe" age:50 eyeColor:"blue" }; var person = { firstName: "John" lastName : "Doe" id : 5566 fullName : function() { return this.firstName " " this.lastName; } }; 下面引出对象的创建方式。对于javascript对象的创建,看了很多的教程,发现有太多的创建的方式。这里就总结一下。插一句,究竟什么是对象?对象的定义是什么?请看上一篇文章。文中介绍的两种对象代码是最基本的对象代码,如下:
近来在学javascript,由于我自己是一边工作一边学习。学习的知识点也是比较零散的。可能东一榔头西一棒槌吧。大家见谅。
对于知识来说,可能是比较枯燥的,但是我觉得,如何能够在其中找到乐趣,全看用的吧,我这人一直比较喜欢分享自己的见识和学习吧,既是记录也是学习,还是分享。
本人属于比较逗逼的类型吧,脑回路也很奇葩,还可能十分跳跃。大家能学到干货就学到,学不到权当一乐哈!
废话不多说,开始今天的分享。
对于javascript对象的创建,看了很多的教程,发现有太多的创建的方式。这里就总结一下。
插一句,究竟什么是对象?对象的定义是什么?请看上一篇文章。
文中介绍的两种对象代码是最基本的对象代码,如下:
var person = { firstName:"John" lastName:"Doe" age:50 eyeColor:"blue" }; var person = { firstName: "John" lastName : "Doe" id : 5566 fullName : function() { return this.firstName " " this.lastName; } };
下面引出对象的创建方式。
1、对象字面量
其实上面的定义方式就是对象字面量的创建方式了。
var person ={ name: "lisi" age: 21 family: ["lida" "lier" "wangwu"] say: function(){ alert(this.name); } };
这里提到一个叫,对象直接量的词汇和这里说的对象字面量,我进行了对比,这篇文章就把他们两个看成同一种方法了。
//创建简单对象
var obj1 = {}; //空对象 var obj2 = { name: "ys" age: 12 };
//创建复杂对象
var obj3 = { name: "ys" age: 12 like: { drink: "water" eat: "food" } };
值得注意的是,对象直接量创建的对象,键值对的值支持表达式
var obj2 = { name: "ys" age: 12 }; //创建复杂对象 var obj3 = { name: "ys" age: obj2.age like: { drink: "water" eat: "food" } };
2、使用new操作符和Object创建对象
即
var a = new Object(); a.name = "sudoudou"; a.age = 18; a.say = function(){ console.log('你好') }
插一句:
new关键字常用的组合
var obj1 = new Object(); var obj2 = new Array(); var obj3 = new Date(); var obj4 = new RegExp("ys");
建议不要用以下的内容
var x = new String(); // 把 x 声明为 String 对象 var y = new Number(); // 把 y 声明为 Number 对象 var z = new Boolean(); // 把 z 声明为 Boolean 对象
请不要把字符串、数值和布尔值声明为对象!
如果通过关键词 "new" 来声明 JavaScript 变量,则该变量会被创建为对象:
请避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。
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
定义的模块是,外面套一个函数,内部使用new关键字 Object
工厂模式解决了重复实例化多个对象的问题,但没有解决对象识别的问题(但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,本例中,得到的都是o对象,对象的类型都是Object,因此出现了构造函数模式)。
4、构造函数
function Person(name age){ this.name=name; this.age=age; this.say=function(){ console.log('你好') } } var person1 = new Person('sudoudou' 18) var person2 = new Person('suchao' 18)
对比工厂模式有以下不同之处:
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); //21
原型模式的好处是所有对象实例共享它的属性和方法(即所谓的共有属性),此外还可以如代码第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);
可以看出,混合模式共享着对相同方法的引用,又保证了每个实例有自己的私有属性。最大限度的节省了内存
以上六种方式,表示只看懂了三种(对象字面量,构造函数和new Object方法),觉得这三种应用的比较广泛,后三种是在别人家博客上抄的。。。