js 创建对象的几种方法
1、 使用object创建
var person = new Object();
person.name = "Tom";
person.age = "29";
person.job = "software engineer";
person.sayName = function(){
console.log(this.name);
} console.log(typeof person); // object
console.log(person instanceof Object); //true
2、 字面量对象
var person = {
name: "Tom",
age:29,
job:"software engineer",
sayName:function(){
console.log(this.name);
}
}
console.log(typeof person); // object
console.log(person instanceof Object); //true
使用字面量创建对象比使用object创建直观一些。这两种创建对象的方式都有明显的缺点:使用同一个接口创建很对对象,会产生大量的重复代码
3、 工厂模式
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.job = job;
o.age = age;
o.sayName = function(){
console.log(this.name);
}
return o;
}
var p1 = createPerson("Tom",29,"software engineer");
var p2 = createPerson("Jerry",32,"doctor");
console.log(typeof p1); // object
console.log(p1 instanceof createPerson); // false
工厂模式,可以使用同一种接口创建多个对象,且很简洁。但也有一个问题:无法确定该对象实例属于哪种对象类型(instanceof 无效)。
4、构造函数模式
function Person(name,age,job){
this.name = name;
this.job = job;
this.age = age;
this.sayName = function(){
console.log(this.name);
}
}
var p1 = new Person("Tom",29,"software engineer");
var p2 = new Person("Jerry",32,"doctor");
console.log(typeof p1); // object
console.log(p1 instanceof Person); // true
console.log(p1 instanceof Object); // true
console.log(p1.constructor == Person); // true
p1.sayName(); //Tom
//构造函数当作普通函数来使用
Person("jack",30,"driver");
window.sayName(); // jack
// 在另一个对象的作用域中使用
var o = new Object();
Person.call(o,"Kristen",25,"Nurse");
o.sayName() // Kristen
Person() 函数没有显示地创建对象,直接将属性和方法赋给了this对象,没有 return 语句。
使用 new 操作符创建新的对象实例,调用构造函数实际上会经过以下步骤:创建一个新对象,将构造函数的作用域赋给新对象(this指向这个新对象),执行构造函数中的代码(为新对象添加属性),返回新对象。
构造函数也是函数,也可以正常调用。
构造函数的缺点是:每个的方法都要在每个对象实例上重新创建一遍,上面创建的p1 、p2都有一个sayName()的方法,但这两个方法不是同一个Function的实例,因为每定义一个函数就是实例化了一个对象
function Person(name,age,job){
this.name = name;
this.job = job;
this.age = age;
this.sayName = new Function("console.log(this.name);"); //逻辑上与声明函数是等价的,并且每创建一个对象就要执行一次
}
var p1 = new Person("Tom",29,"software engineer");
var p2 = new Person("Jerry",32,"doctor");
console.log(p1.sayName == p2.sayName); // false
当然为了构造函数创建对象时,每个函数都是同一个Function实例,也可以使用全局函数:
function Person(name,age,job){
this.name = name;
this.job = job;
this.age = age;
this.sayName = sayName; // 使用全局函数
}
function sayName(){
console.log(this.name);
}
var p1 = new Person("Tom",29,"software engineer");
var p2 = new Person("Jerry",32,"doctor");
console.log(p1.sayName == p2.sayName); // true
但是这样,如果有很多函数,就要定义很多全局函数,没有封装性
5、原型模式
每个函数都有一个 prototype 属性,一个指向某个对象(原型对象)的指针,原型对象中包含着所有实例共享的属性和方法。那么就可以使用原型来新建对象
function Person(){
}
Person.prototype.name = "Tom";
Person.prototype.job = "software engineer";
Person.prototype.friends = ["Shelby","Court"];
Person.prototype.age = 29;
Person.prototype.sayName = function (){
console.log(this.name);
};
var p1 = new Person();
var p2 = new Person();
p1.friends.push("Van");
p1.sayName(); // Tom
p2.sayName(); // Tom
console.log(p1.friends); // "Shelby,Court,Van"
console.log(p2.friends); // "Shelby,Court,Van"
console.log(p1.friends == p2.friends); // true
console.log(p1.sayName == p2.sayName); // true
很明显,单独使用原型新建对象时,不能传递参数,并且会因为所有对象的数据都一样而不能添加某个对象自己的特性
6、构造函数和原型模式的组合模式
function Person(name,age,job){
this.name = name;
this.job = job;
this.age = age;
this.friends = ["Shelby","Court"];
}
Person.prototype.sayName = function (){
console.log(this.name);
};
var p1 = new Person("Tom",29,"software engineer");
var p2 = new Person("Jerry",32,"doctor");
p1.friends.push("Van");
p1.sayName(); // Tom
p2.sayName(); // Jerry
console.log(p1.friends); // "Shelby,Court,Van"
console.log(p2.friends); // "Shelby,Court"
console.log(p1.friends == p2.friends); // false
console.log(p1.sayName == p2.sayName); // true
这是一种常用模式
也可以对其进行一些修改:
function Person(name,age,job){
this.name = name;
this.job = job;
this.age = age;
this.friends = ["Shelby","Court"];
if(this.sayName != "function"){
Person.prototype.sayName = function (){
console.log(this.name);
};
}
}
现在自身属性和原型的初始化,都封装在构造函数中,看起来更像面向对象。这样的写法下,不能使用对象字面量重写原型,因为对象字面重写原型不会让现有实例和新原型联系起来,与现有实例联系的还是旧原型。
js 创建对象的几种方法的更多相关文章
- js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数
文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法 先创建一个对象函数 function Obj() { this.addre ...
- js创建对象的三种方法
1.使用对象初始化器:{} var person = {....} 2 var person=new object() function person(参数) { this.参数=... } var ...
- java中需要关注的3大方面内容/Java中创建对象的几种方法:
1)垃圾回收 2)内存管理 3)性能优化 Java中创建对象的几种方法: 1)使用new关键字,创建相应的对象 2)通过Class下面的new Instance创建相应的对象 3)使用I/O流读取相应 ...
- 创建对象的两种方法: new 和 面向对象(对象字面量)及对象属性访问方法
创建对象的两种方法: new 和 面向对象(对象字面量)用 new 时:var o = new Object();o.name = "lin3615";alert(o.name); ...
- js去除空格12种方法
注:本文非本人原著:原文作者: 黄卉 <js去除空格12种方法> //JS去除空格的方法目前共有12种: //实现1 String.prototype.trim = function() ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- 判断数组的方法/判断JS数据类型的四种方法
参考文: 以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() . instanceof 以及 Array.isArray() h ...
- 判断JS数据类型的四种方法
在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined.N ...
- 判断JS数据类型的几种方法
原文转自http://www.cnblogs.com/onepixel/p/5126046.html! 说到数据类型,我们先说一下JavaScript 中常见的几种数据类型: 基本类型:string, ...
随机推荐
- Eclipse中JSP生成的class文件去了哪里?
转自:http://www.cnblogs.com/xing901022/p/4352999.html 首先应该了解的是Tomcat在Eclipse的映射关系,参考前一篇博文所述:Tomcat的服务器 ...
- 通俗理解caller和callee
caller 返回一个调用当前函数的引用: callee 返回一个正在被执行函数的引用: 举个例子: 当前有函数 a() 直接使用了caller 方法: b() 直接使用了callee方法: ca() ...
- raw格式和qcow2格式
Raw: "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使 ...
- 网络表示学习Network Representation Learning/Embedding
网络表示学习相关资料 网络表示学习(network representation learning,NRL),也被称为图嵌入方法(graph embedding method,GEM)是这两年兴起的工 ...
- python中strip、startswith、endswith
strip(rm)用来删除元素内的空白符: rm对应要删除空白符的元素,当rm为空(strip())时删除所有元素的空白符 startswith.endswith用来查找开头或结尾条件的元素 例子: ...
- CDH 安装遇到的问题
CDH 遇到的问题 l JAVA_HOME问题 这里, 很明显可以看到, JAVA_HOME 并没有设置成功.using as ... 感觉完全就是没有设置JAVA_HOME 这个环境变量.可是呢 ...
- 增删改查列表angular.js页面实现
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- window.location.search的用法 和 地址栏的的javsscript编码与解码
ocation.search是从当前URL的?号开始的字符串 如:http://www.51js.com/viewthread.php?tid=22720 它的search就是?tid=22720 e ...
- PHPExcel在TP下使用
第一:你要去PHPExcel官网下载,然后放到网站的Vendor文件夹下面.当然这是为了好管理和导入.你放在其他位置也没有关系. 第二:当然是在你需要的地方写代码.我只写样例,你看懂了就可以灵活的使用 ...
- Spring Cloud(2)A Eureka server端 服务注册建立
1. 父项目pom <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...