参考资料依旧《JavaScript高级程序设计》,不得不说这本书写的太好了,讲的极为清晰凝练,好书!

先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:

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>

最新文章

  1. 【Unity3d】火炬之光的X射线效果
  2. myeclipse下构建maven web项目
  3. a 标签中调用js的几种方法 文章摘自他人
  4. [Maven] - 安装与Eclipse搭建
  5. PsySH:PHP交互运行环境
  6. CSS伪类与CSS伪元素的区别及由来
  7. 如何把其他用户创建的表,导入到自己数据库是,所有者owner改变为自己创建的用户
  8. python核心编程第六章练习6-9
  9. 《Java程序设计》课程准备之问卷调查
  10. 常用的sql语句(找不同位数,找重复)
  11. php基础26:文件与目录1
  12. [NOIp 2017]逛公园
  13. cocos-lua3.17 Lua tablrView工具类
  14. [Ynoi2018]未来日记
  15. jQuery-UI的使用
  16. Junit4使用实验报告
  17. 前端异常监控 - BadJS
  18. tgz的解压
  19. Elasticsearch分布式机制探究
  20. 零基础学C#算法(零基础学算法——C#版)

热门文章

  1. [转]实例化SqlParameter时,如果是字符型,一定要指定size属性
  2. ArrayList &#160;集合
  3. 【U1结业机试题】新闻内容管理系统:解析XML文件读取Html模版生成网页文件
  4. 区域可编辑contenteditable的问题总结
  5. Iscrool下拉刷新
  6. .NET开源工作流RoadFlow-表单设计-组织机构选择
  7. Android UI 切图命名规范、标注规范及单位描述(转载)
  8. CentOS 7 使用 yum 安装 jdk 1.8
  9. February 24 2017 Week 8 Friday
  10. 原文:I don’t want to see another “using namespace xxx;” in a header file ever again