/*1、工厂模式*/
function createPerson(name,age,job) {
var o = new object();
o.name = name;
o.age = age;
o.job = job;
o.setName = function(newName) {
this.name = newName;
};
return o;
}
var person1 = createPerson("zcj", 21, "Soft Engineer");
/*
问题:只能创建多个相似的对象,不能识别对象
*/

  

/*2、构造函数模式*/
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.setName = function(newName) {
this.name = newName;
}
}
var person1 = new Person("zcj", 21, "Soft Engineer");
/*
问题:每个方法都要在实例上重新创建一遍
*/
/*3、原型模式*/
function Person() {
} person.prototype.name = "zcj";
person.prototype.age = 21;
person.prototype.job = "Soft Engineer";
person.prototype.sayName = function() {
alert(this.name);
}; var person1 = new Person();
var person2 = new Person();
alert(person1.sayName == person2.sayName); //true person1.name = "Greg";
alert(person1.name); //"Greg"
alert(person2.name); //"zcj" delete person1.name;
alert(person1.name); //"zcj"
/*
问题:所有实例在默认情况下取得相同的属性值;对于引用类型的属性,为所有实例共享(这是不期望的)
*/

  

/*4、组合使用构造函数模式和原型模式*/
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
friends = ["Shelby","Court"]
}
Person.prototype = {
constructor:Person,
sayName: function() {
alert(this.name);
}
}
var person1 = new Person("zcj",21,"Soft Engineer");
var person2 = new Person("Gerg",27,"Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shellby,Court,Van"
alert(person2.friends); //"Shellby,Court"
alert(person1.friends === person2.friends); //false
alert(person1.sayName === person2.sayName); //true
/*
说明:使用最广泛,认同度最高的创建自定义类型的方法
*/

  

/*5、动态原型模式*/
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function") {
Person.prototype.sayName = function() {
alert(this.name);
};
}
}
var friend = new Person("zcj", 21, "Soft Engineer");
friend.sayName();
/*
说明:将所有信息封装在构造函数中,通过检查某个应该存在的方法是否有效,决定是否需要初始化
*/

  

/*6、寄生构造函数模式*/
function Person(name,age,job) {
var o = new object();
o.name = name;
o.age = age;
o.job = job;
o.setName = function(newName) {
this.name = newName;
};
return o;
}
var person1 = new Person("zcj", 21, "Soft Engineer");
person1.setName("Gerg");
alert(person1.name); //"Gerg"
/*
说明:与工厂模式区别:1、实例化对象要使用new;2、改包装函数为构造函数(函数名第一个字母大写)
*/
/*7、稳妥构造函数*/
function Person(name,age,job) {
var o = new object();
//创建私有变量和函数
var privateVariable = 10;
function privateFunction() {
return false;
} //添加特权方法
o.sayName = function() {
alert(name);
};
//返回对象
return o;
}
/*
这种模式创建的对象中,除了sayName方法外,没有其他方法访问name属性
*/

  

javascript创建对象的7种方式的更多相关文章

  1. JavaScript 创建对象的七种方式

    转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...

  2. JavaScript创建对象的几种 方式

    //JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...

  3. javascript创建对象的几种方式

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用.主要为下面几种:1.对象字面量的方式 person={firstname ...

  4. [转载]javascript创建对象的几种方式

    原文链接:http://qingfeng825.iteye.com/blog/1935648 1. 工厂方法:能创建并返回特定类型对象的工厂函数(factory function). function ...

  5. JavaScript创建对象的6种方式

    JavaScript创建对象简单的说,无非就是使用内置对象(Object)或各种自定义对象,当然还可以用JSON,但写法有很多种,也能混合使用. 1.对象字面量的方式 person = {name : ...

  6. javascript创建对象的几种方式?

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 person={ firstname:" ...

  7. JavaScript创建对象的几种方式总结

    ECMA把对象定义为:无序属性的集合,其属性可以包含基本值.对象或者函数. 1. 使用Object构造函数创建对象 创建自定义对象的最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法 ...

  8. javascript 创建对象的几种方式

    1. //基于已有对象扩充其属性和方法var object = new Object(); object.name = "zhangsan"; object.sayName = f ...

  9. Javascript 创建对象的三种方式

    function createPerson(name, qq) //工厂方式 { //在工厂里创建个对象 var obj=new Object(); obj.name=name; obj.qq=qq; ...

随机推荐

  1. SELECT /*!40001 SQL_NO_CACHE */ * INTO OUTFILE '/tmp/ClientActionTrack2015112511.txt' 不堵塞事务

    mysql> insert into ClientActionTrack20151125(clientSn,ip,url,httpMethod,requestParams,requestHead ...

  2. Adroid解析json

    参考资料: http://www.open-open.com/lib/view/open1326376799874.html http://www.cnblogs.com/tt_mc/archive/ ...

  3. git图示所有分支的历史

    1.第一种方法 git gui 菜单栏上 repository-->visual all branch history 或者直接使用命令gitk --all 2.在git bash中,使用命令查 ...

  4. POJ_3280_Cheapest_Palindrome_(动态规划)

    描述 http://poj.org/problem?id=3280 n 种小写字母构成长度为 m 的串,现在要通过增删字母使串回文,给出每种字母增和删的费用,求最小花费. Cheapest Palin ...

  5. 如何编译Support7Demos测试appcompat

    目录(?)[-] 简介 在Eclipse中编译 使用Gradle编译 简介 Google发布的API-18中带上的support-v7包含了appcompat组件,可以在小于API-11的androi ...

  6. time.h

    目录 1简介 2代码示例 3从系统时钟获取时间方式 4time函数介绍 函数名称: localtime 函数名称: asctime 函数名称: ctime 函数名称: difftime 函数名称: g ...

  7. HTML5与CSS3权威指南.pdf1

    第2章 HTML5与HTML4的区别 HTML5的文件扩展符与内容类型保持不变仍为“.html”或“.htm”,内容类型(ContentType)仍为“text/html” DOCTYPE声明: HT ...

  8. JavaScript高级程序设计37.pdf

    用DOM范围实现简单选择 selectNode()和selectNodeContents()它们都接收一个DOM节点参数,然后使用该节点中的信息来填充范围,其中selectNode()方法选择整个节点 ...

  9. .net常見面試題(二)

    一.选择题 1. 下面叙述正确的是___C___. A.算法的执行效率与数据的存储结构无关 B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终 ...

  10. Yii AR Model CRUD数据库操作

    Yii AR很好很强大,但刚开始不知道怎么使用,可以先看下官方文档 官方文档:http://www.yiichina.com/guide/database.ar 下面是我对AR的一些理解 对于一个Mo ...