JavaScript中创建对象的几种模式

看了js高级程序设计的第六章,很多知识。关于创建对象的几种模式,这里记录一下。

1.工厂模式

 1 function createPerson(name, age, job) {
 2     var o = new Object();
 3     o.name = name;
 4     o.age = age;
 5     o.job = job;
 6     o.sayName = function() {
 7         return this.name;
 8     };
 9     return o;
10 }

没有解决对象识别的问题,不能知道一个对象的类型

2.构造函数模式

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}

var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

alert(person1.constructor == Person);
alert(person2.constructor == Person);
alert(person1 instanceof Object);
alert(person1 instanceof Person);
alert(person2 instanceof Object);
alert(person2 instanceof Person);

//当作构造函数使用
var person = new Person("Nicholas", 29, "Software Engineer");
person.sayName();

//当作普通函数使用
Person("Greg", 27, "Doctor");
window.sayName();

//在另一个对象的作用域中调用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse");
o.sayName();

(1)以new操作符调用原生构造函数模式创建对象;
(2)给了实例一个特定的类型;
(3)既可用于创建对象,又可当作普通函数用。

3.原型模式

function Person() {
}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    alert(this.name);
};

var person1 = new Person();
person1.sayName();

var person2 = new Person();
person2.sayName();

alert(person1.sayName == person2.sayName);

//alert(Person.prototype.isPrototypeOf(person1));
//alert(Person.prototype.isPrototypeOf(person2));

alert(Object.getPrototypeOf(person1) == Person.prototype);
alert(Object.getPrototypeOf(person1).name);

function hasPrototypeProperty(object, name) {
    return !hasOwnProperty(name) && (name in object);
}

var person = new Person();
alert(hasPrototypeProperty(person, "name"));

person.name = "Greg";
alert(hasPrototypeProperty(person, "name"));

var keys = Object.getOwnPropertyNames(Person.prototype);
alert(keys);

//更简单的原型语法:此时constructor属性不再指向Person

function Person() {
};

Person.prototype = {
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    sayName : function() {
        alert(this.name);
    }
};

var friend = new Person();

Person.prototype.sayHi = function() {
    alert("Hi");
};

friend.sayHi();

function Person() {
};

Person.prototype = {
    constructor : Person,
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    friends : ["Shelby", "Court"],
    sayName : function() {
        alert(this.name);
    }
};

var person1 = new Person();
var person2 = new Person();

person1.friends.push("Van");

alert(person1.friends);
alert(person2.friends);
alert(person1.friends === person2.friends);

(1)理解原型对象是重点,构造函数中prototype属性指向原型,原型中constructor属性又指向构造函数,实例中的prototype属性也指向原型,是指针不是副本;
(2)使用更简单的原型语法相当于重写原型,此时constructor属性需要显示设置指向构造函数;
(3)对于引用类型来说,一个实例给原型增删属性会影响其他实例。

4.构造函数模式和原型模式组合/动态原型模式

采用组合的构造函数模式与原型模式,构造函数定义实例属性,原型定义共享属性和方法。动态原型模式是在原型模式基础上,通过if判断需不需要在原型中定义属性或方法。

//动态原型模式
function Person(name, age, job){

    //属性
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Shelby", "Court"];

    //方法
    if (typeof this.sayName != "function"){

        Person.prototype.sayName = function() {
            alert(this.name);
        };
    }
}

Person.prototype = {
    constructor : Person,
    sayName : function(){
        alert(this.name);
    }
}

var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

person1.friends.push("Van");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends === person2.friends);
alert(person1.sayName === person2.sayName);

(1)目前最受欢迎的就是组合模式

5.寄生构造函数模式

/*寄生构造函数模型*/
function Person(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        alert(this.name);
    };
    return o;
}

var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();

function SpecialArray(){
    var values = new Array();
    values.push.apply(values, arguments);
    values.toPipedString = function() {
        return this.join("|");
    };

    return values;
}

var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString());

(1)用来利用原生对象定制自己特殊功能的对象;
(2)同等条件下,不推荐使用。

6.稳妥构造函数模式

(1)只有构造函数内部的方法可以访问私有成员,其他不能访问;(2)这种方法较为安全,但不能用instanceof操作符。

时间: 2024-12-25 02:10:26

JavaScript中创建对象的几种模式的相关文章

JavaScript中创建对象的7种模式

ECMA-262把对象定义为:"无需属性的集合,其属性可以包含基本值.对象或者函数."严格来讲,这就相当于说明对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函数. 创建自定义对象最简单的方式就是创建一个Object的实例,然后再为他添加属性和方法,如下所示: var person = new Object(); person.name = &qu

javascript中创建对象的几种方式

javascript中提供了通过Object构造函数或对象字面量方式来创建单个的对象,当我们想要创建很多对象的时候,简单的通过这两种方法就会产生大量的重复.在此,我总结了几种创建对象的模式.本文是在我阅读<javascript高级程序设计>后总结而来. 1.工厂模式 这种模式通过用函数来减少代码重复,利用函数的参数作为接口,与对象的属性与方法对接. function createfactory(name,age){ var obj = new Object(); obj.name = name

深入理解JavaScript中创建对象模式的演变(原型)

创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Object构造函数和对象字面量方法 工厂模式 自定义构造函数模式 原型模式 组合使用自定义构造函数模式和原型模式 动态原型模式.寄生构造函数模式.稳妥构造函数模式 第一部分:Object构造函数和对象字面量方法 我之前在博文<javascript中对象字面量的理解>中讲到过这两种方法,如何大家不熟悉,可以点进去看一看回顾一下.它们的优点是用来创建单个的对象非常方

javascript 创建对象的7种模式

使用字面量方式创建一个 student 对象: 1 var student = function (){ 2 name : "redjoy", 3 age : 21, 4 sex: women, 5 sayName: function(){ 6 alert(this.name); 7 } 8 }; 使用Object.defineProperties() 方法给对象添加属性:(只有IE9+,FF4+,SF5+,OP 12+,Chrome支持) 1 var student = {}; 2

javascript中创建对象和实现继承

# oo ##创建对象 1. 原型.构造函数.实例之间的关系 * 原型的construct->构造函数:调用isPrototypeOf(obj)方法可以判定和实例的关系:  * 构造函数的prototype->原型:  * 实例的__proto__ ->原型(仅在chrome,safari,Firefox中存在,而共有的是[[prototype]]):用getPrototypeOf()方法可以返回[[prototype]]的值:  * 构造函数后构造函数的‘子类’new产生一个实例,可以

js创建对象的几种模式

//javaScript创建对象的几种模式特点 /*//1 工厂模式function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=function() { alert(name); }} createPerson("Tom",18,"Teachaer");createPerson("Jack",20,"Student"

Java中创建对象的五种方式

我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone方法去创建对象,通过序列化和反序列化的方式去创建对象.这里就总结一下创建对象的几种方式,来好好学习一下java创建对象的方式. 一.使用new关键字 这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的). 比如:Student student = n

Java中创建对象的几种方式

Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Class类的newInstance方法.使用Constructor类的newInstance方法.使用Clone方法.使用反序列化. 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的).比如:Student student = ne

实现JavaScript中继承的三种方式

一.原型链继承  在原型链继承方面,JavaScript与java.c#等语言类似,仅允许单父类继承.prototype继承的基本方式如下: 代码如下: function Parent(){} function Child(){} Child.prototype = new Parent(); 通过对象Child的prototype属性指向父对象Parent的实例,使Child对象实例能通过原型链访问到父对象构造所定义的属性.方法等.  构造通过原型链链接了父级对象,是否就意味着完成了对象的继承