Javascript面向对象学习笔记(二)--创建对象(七种模式)

一、工厂模式

  考虑到ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节

  

function createPerson(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 person1=createPerson("小码农",18,"码农");
var person1=createPerson("老码农",38,"码农");

  工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题,即怎么样知道一个对象的类型。(这句话怎么理解????)

 二、构造函数模式

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

var person1=new Person("小码农",18,"码农");
var person1=new Person("老码农",38,"码农");

与工程模式的createPerson()不同的地方:

1、没有显式地创建对象;

2、直接将属性和方法赋给了this对象;

3、没有return语句;

  创建的对象既是Object的实例,同时也是Person的实例

alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true

三、原型模式

prototype就是调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处就是所有对象实例共享他所包含的属性和方法。

function Person(){}

Person.prototype.name="leo";
Person.prototype.age=29;
Person.prototype.job="软件工程师";
Person.prototype.sayName=function(){
     alert(this.name);
};

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

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

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

  与构造函数模式不同的是,新对象的这些属性和方法是由所有实例共享的。person1和person2访问的都是同一组属性和同一个sayName()方法。

  Person的每个实例-----person1和person2都包含一个内部属性,该属性仅仅指向了Person.prototype;换句话说,他们与构造函数没有直接的关系。

  可以通过isPrototypeOf()方法来确定对象之间存在这种关系。如:

alert(Person.prototype.isPrototypeOf(Person1));  //true
alert(Person.prototype.isPrototypeOf(Person2));  //true

  Object.getPrototypeOf()方法,返回[[Prototype]]的值。如:

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

  每当代码读取某个对象的某个属性时,搜索首先从兑现实例本身开始,如果找到给定名字的属性,则返回该属性的值;如果没有找到,则继续收缩指针指向的原型对象,在原型对象中查找具有给定名字的属性。有则返回该属性的值。也就是说,如果我们在调用Person.sayName()时,会先后执行两次搜索。首先,解析器会问:“实例person1有sayName属性吗? 答”没有“,然后他继续问:”person1的原型中有sayName属性么?“答:有,就读取那个保存在原型对象中的函数。

  如果我们在实例中添加了一个属性,而该属性与实例原型中的一个属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的那个属性。

  使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法旨在给定属性存在于对象实例中时,才会返回true。

  

时间: 2024-12-23 03:57:55

Javascript面向对象学习笔记(二)--创建对象(七种模式)的相关文章

javascript面向对象学习笔记(二)——创建对象

javascript面向对象学习笔记(二)--创建对象 工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(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 person1=createPerson("Chiaki&

javascript面向对象学习笔记——创建对象(转)

工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(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 person1=createPerson("Chiaki",21,"Software Engi

JavaScript面向对象学习笔记

面向对象:变量和属性一样的.属性:属于一个对象变量:属于任何一个人函数:方法:属于一个对象难点:this:当前的方法属于谁,this就是谁的例子window.show = function(){ alert(this);}//this是windowfunction show(){ alert(this);}Object:用来实现对象var obj = new Object();例子:var obj = new Object();obj.name = "zhaobw";obj.age =

JavaScript正则表达式学习笔记之一 - 理论基础

自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月??.当时信誓旦旦说的定期写篇博客的计划也就泡汤了??,不过好在最近有空,顺便总结一下这两个月遇到的几个问题.第一个问题就是项目中用到了一些正则才发现之前被自己忽略的正则是时候补一补了.恰逢今天周六??,就把自己学习JavaScript正则表达式的笔记整理成文,写了这篇关于正则表达式理论基础的文章,希望本文能对有需要的同学提供帮助.号外:本文相对基础,大神请忽略??. 一. 基本概念 正则表达式是用于匹配字符串中字符组合的模式. 一种几乎可

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

Ajax学习笔记(二)

二.prototype库详解 1.prototype库的使用 //导入下载好的prototype.js文件 <script type="text/javascript" src="prototype.js"></script> //在自己的js中直接使用Prototype对象 <script type="text/javascript"> document.writeln("Prototype库的版本

javascript基础学习(二)

javascript的数据类型 学习要点: typeof操作符 五种简单数据类型:Undefined.String.Number.Null.Boolean 引用数据类型:数组和对象 一.typeof操作符 typeof操作符用来检测变量的数据类型,操作符可以操作变量也可以操作字面量. 对变量或值运用typeof操作符得到如下值: undefined----如果变量是Undefined类型: boolean-------如果变量是Boolean类型: number-------如果变量是Numbe

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

JavaScript闭包学习笔记

原文:JavaScript闭包学习笔记 闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. JavaScript语言的特殊之处,就在于函数内部可以直接读取全局变量. 1 var n=999; 2 3 function f1() { 4 alert