oo是javascript的重点也是难点,这一章我看了好几遍了。个人觉得这章理解起来不是特别容易,所以有些笔记我决定按照自己的理解以及网上一些前辈写的比较好的文章来写,如有不正确望斧正。后续可能会对内容更新。
OOP 定义:使用对象时,只关注对象提供的功能,不关注内部细节,更简洁说是,不了解原理的情况下,会使用其功能。
对象 定义:“黑盒子”,不了解内部结构,知道表面的各种操作。
6.1创建对象
var person = new Object(); person.name = "flyer"; person.age = "26"; person.job = "WED"; person.sayName = function(){ alert(this.name); } person.sayName();
缺点:使用同一个接口创建很多对象,会产生大量重复的代码。
6.1.1工厂模式
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("flyer",26,"WED"); var person2 = createPerson("bird",27,"UE"); person1.sayName();// flyer person2.sayName();// bird
优点:抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节。
缺点:解决了创建多个相似对象的问题,但没有解决对象识别的问题。
没有new。
函数重复,资源浪费。
6.1.2 构造函数模式
function Person(name, age, job){ //构造函数以一个大写字母开头 /* 系统会做的事情: * var this = new Object(); 声明的this是新的空白对象 * */ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }; // 系统会替我们返回 return this } var person1 = new Person("flyer",26,"WED"); //当在函数加new时,系统会做一些事情 var person2 = new Person("bird",27,"UE"); person1.sayName(); //"flyer" person2.sayName(); //"bird" alert(person1.constructor == Person); //true alert(person2.constructor == Person); //true /* * 对象的constructor属性最初是用来标识对象类型的,检测类型用instanceof操作符更可靠。 * person1和person2对象既是Object的实例,也是Person的实例。 */ alert(person1 instanceof Object); //true alert(person1 instanceof Person); //true alert(person2 instanceof Object); //true alert(person2 instanceof Person); //true alert(person1.sayName == person2.sayName); //false
构造函数与其他函数的唯一区别,就是调用方式不同。任何函数,只要通过new操作符来调用,就是构造函数。
缺点:每个方法都要在每个实例上重新创建一遍。
在全局作用域中定义的函数实际上只能被某个对象引用,如果对象定义很多方法,那么就要定义很多个全局函数,我们定义的这个引用类型没有封装性可言。
6.1.3 原型模式
定义:用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。也就是通过调用构造函数而创建的那个对象的原型对象。使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象信息,而是可以将这些信息直接添加到原型对象中。
function Person(){ } Person.prototype.name = "flyer"; Person.prototype.age = 26; Person.prototype.job = "WED"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); // "flyer" var person2 = new Person(); person2.sayName(); // "flyer" alert(person1.sayName == person2.sayName); // true
1.理解原型
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性。在默认的情况下,所有prototype属性都会自动获得一个constructor属性,这个属性包含一个指向prototype属性函数的指针。
个人理解原型就是类似于css中的class。
用构造函数加属性
原型加方法
使用hasOwnProperty()方法可以检测一个属性是存在于实例还是原型中。
function Person(){ } Person.prototype.name = "flyer"; Person.prototype.age = 26; Person.prototype.job = "WED"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); var person2 = new Person(); person1.name = "bird"; alert(person1.name); // bird --来自实例 alert(person1.hasOwnProperty("name")); // true alert("name" in person1); // true alert(person2.name); // flyer --来自原型 alert(person2.hasOwnProperty("name")); // false alert("name" in person2); // true delete person1.name; alert(person1.name); // flyer --来自原型 alert(person1.hasOwnProperty("name")); // false alert("name" in person1); // true
2.原型与in操作符
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性。在默认的情况下,所有prototype属性都会自动获得一个constructor属性,这个属性包含一个指向prototype属性函数的指针。
关于原型模式的理解可以参考tom大叔的文章http://www.cnblogs.com/TomXu/archive/2012/04/16/2436460.html
3.更简单的原型语法
function Person(){ } Person.prototype = { name : "flyer", age : 26, job: "WED", sayName : function () { alert(this.name); } }; var person = new Person(); alert(person instanceof Object); //true alert(person instanceof Person); //true alert(person.constructor == Person); //false alert(person.constructor == Object); //true
4.原型的动态性
把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
function Person(){ } var person = new Person(); Person.prototype = { constructor : Person, name : "flyer", age : 26, job: "WED", sayName : function () { alert(this.name); } }; person.sayName(); //error
5.原生对象的原型
可以像修改自定义对象的原型一样修改原生的原型。
String.prototype.startWith = function(){ //给String添加一个名为startsWith()的方法 return this.indexOf(text) == 0; } var msg = ‘hello world’; alert(msg.startWith(‘hello’)); // true
6.原型对象的问题
原型中所有属性是被很多实例共享的,对于包含引用类型的值来说,问题比较突出。
function Person(){ } Person.prototype = { constructor : Person, name : "flyer", age : 26, job: "WED", friends:["bird","stone"], sayName : function () { alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push("andy"); alert(person1.friends); alert(person2.friends); alert(person1.friends == person2.friends);
6.1.4 组合使用构造函数模式和原型模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["bing","bird"]; } Person.prototype = { constructor : Person, sayName : function(){ alert(this.name); } } var person1 = new Person("flyer",26, "WED"); var person2 = new Person("tolly",27, "UE"); person1.friends.push("cally"); alert(person1.friends); // bing bird cally alert(person2.friends); // bing bird alert(person1.friends === person2.friends); // bing bird alert(person1.sayName === person2.sayName); // bing bird
相关推荐
学习Java必备的学习笔记里面包含OOP的所有应用
C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# OOP程序设计C# ...
javascript oop模式讲解,内容丰富充实,包含dom(一个todolistshi实例)操作。
浙江大学oop(面向对象程序设计)历年考题(英文版) 包含答案
oop与javascript oop与javascript oop与javascript
《PHP高级程序设计_模式、框架与测试》中文版PDF 本书采用循序渐进的方式介绍了用php进行web开发的相关知识。书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂...
” ——Amazon.com 目录第一部分 OOP和模式 第1章 抽象类、接口和契约式编程 第2章 静态变量、成员和方法 第3章 单例模式和工厂模式 第4章 异常 第5章 PHP 6中的新特性第二部分 测试和文档编写 第6章 ...
Javascript的OOP编程Javascript的OOP编程Javascript的OOP编程
JavaScript与OOP讲座 JavaScript与OOP讲座 JavaScript与OOP讲座
北大青鸟ACCP8.0S2JavaOOP第一章学习笔记。
韩顺平老师的javascript笔记 包括基础语法 javascript面向对象编程 dom编程
PHP_OOP面向对象课堂笔记,最简洁明白易懂的面向对象笔记,欢迎下载!
浙江大学面向对象程序设计OOP.pdf
第一部分 OOP和模式 第1章 抽象类、接口和契约式编程 第2章 静态变量、成员和方法 第3章 单例模式和工厂模式 第4章 异常 第5章 PHP 6中的新特性 第二部分 测试和文档编写 第6章 文档编写和编码...
第一部分 OOP和模式 第1章 抽象类、接口和契约式编程 第2章 静态变量、成员和方法 第3章 单例模式和工厂模式 第4章 异常 第5章 PHP 6中的新特性 第二部分 测试和文档编写 第6章 文档编写和编码规范 第7章 反射API ...
Java OOP编程思想学习之我见
PHP高级程序设计_模式、框架与测试.pdf
C++,oop面向对象设计详细介绍!内容丰富!
oop面向设计源代码oop面向设计源代码oop面向设计源代码oop面向设计源代码
面向对象的一个JavaScript文档,介绍js的面向对象性质 如何面向对象的 等等