JavaScript面向对象编程之创建对象
2015-06-19 15:21
633 查看
参考资料依旧《JavaScript高级程序设计》,不得不说这本书写的太好了,讲的极为清晰凝练,好书!
先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:
1.实例的指针仅指向原型,而不指向构造函数。
可以随时为原型添加属性和方法,并且修改能够立刻在所有对象实例中表现出来,但如果重写整个原型对象,那么情况就不一样了。调用构造函数是会为实例添加一个指向最初原型的_proto_指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
2.我们不推荐在产品化的程序中修改原生对象的原型。
3.创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用来定义方法和共享属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存(因为函数也是对象)。另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长。
下面的代码给出了四种构建方法的demo(寄生虫模式和稳妥模式未录入)
1.工厂模式
2.构造函数
3.对象原型
4.构造函数和对象原型组合模式
先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:
1.实例的指针仅指向原型,而不指向构造函数。
可以随时为原型添加属性和方法,并且修改能够立刻在所有对象实例中表现出来,但如果重写整个原型对象,那么情况就不一样了。调用构造函数是会为实例添加一个指向最初原型的_proto_指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
2.我们不推荐在产品化的程序中修改原生对象的原型。
3.创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用来定义方法和共享属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存(因为函数也是对象)。另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长。
下面的代码给出了四种构建方法的demo(寄生虫模式和稳妥模式未录入)
1.工厂模式
2.构造函数
3.对象原型
4.构造函数和对象原型组合模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script language="JavaScript"> // 初试对象 // var person = new Object(); // person.name = "Nicholas"; // person.age = 29; // person.job = "Software Engineer"; // // person.sayName = function(){ // alert(this.name); // }; // // person.sayName(); // 工厂模式 // 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("Nicholas",29,"Softwar Enginner"); // var person2=createPerson("Greg",27,"Doctor"); // person1.sayName(); // person2.sayName(); // 构造函数模式 // 由于工厂模式,可以讲实例表示为一种特定的类型 // function Person(name,age,job) {//按照惯例应大写构造函数的首字母,当然,小写也可以运行 // this.name = name; // this.age = age; // this.job = job; // this.sayName = function(){//sayName后面为什么不加括号? // alert(this.name); // }; // } // var person1 = new Person("Nicholas",29,"Software Enginner"); // var person2 = new Person("Geeg",27,"Doctor"); // // person1.sayName(); // person2.sayName(); // alert(person1 instanceof Person); // alert(person2 instanceof Person); // alert(person1 instanceof Object); // alert(person2 instanceof Object); // Person("zhouge",21,"Studet"); // window.sayName(); // var o = new Object(); // Person.call(o,"xiaoli",55,"singer"); // o.sayName(); // 组合使用构造函数模式和原型模式 function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.friends=["Shelby","Court"]; } Person.prototype={ constructor:Person, sayName:function(){ alert(this.name); } } var person1=new Person("li",22,"SE"); var person2=new Person("zhang",23,"CS"); person1.friends.push("Van"); alert(person1.friends); alert(person2.friends); alert(person1.friends=== person2.friends); alert(person1.sayName === person2.sayName); </script> </body> </html>
相关文章推荐
- JSON字符串与JSON对象的区别
- javascript、js操作json方法总结
- JSON和JSONP的区别
- [js][技巧]生成指定范围指定个数的不重复随机数
- javascript定时器,取消定时器,及js定时器优化方法
- countup.js
- Javascript写了一个2048的游戏
- avalon中的模板绑定(ms-include)
- jsp会话监听
- javascript高级程序设计第5章,引用类型
- js如何定义全局变量
- 如何用js判断不同浏览器
- JSP中遍历显示从Action中接收到的list
- 二级联动下拉列表JS+html实现
- javascript获取当前时间
- 基于JavaScript离线编译工具环境搭建
- IE核心不支持JSON.parse方法
- Json学习笔记之Json的使用
- 解决JSONKIT isa错误
- a href=#与 a href=javascript:void(0) 的区别