参考资料依旧《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>

JavaScript面向对象编程之创建对象的更多相关文章

  1. 深入理解JavaScript系列(17):面向对象编程之概论

    介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...

  2. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  3. Javascript面向对象编程一:基础篇

    该随笔分为以下四部分: Javascript面向对象编程一:基础篇 Javascript面向对象编程二:封装 Javascript面向对象编程三:继承 Javascript面向对象编程四:控件 先弄个 ...

  4. PHP面向对象编程之深入理解方法重载与方法覆盖(多态)

    这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...

  5. python基础-面向对象编程之继承

    面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...

  6. python基础-面向对象编程之反射

    面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...

  7. python基础-面向对象编程之多态

    面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...

  8. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  9. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)

    介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...

随机推荐

  1. java中的输入输出方法

    输入 import java.util.Scanner; public class EnterTest { public static void main(String[] args) { //主方法 ...

  2. 【shell】《shell学习指南》读书笔记

    一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...

  3. c# xml API操作

    LoginInfo loginInfo = new LoginInfo(); xmlNode = _xml.SelectSingleNode(loginUrl); loginInfo.LoginUrl ...

  4. Oracle 过程中变量赋值

    create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...

  5. ArrayList集合长度的问题

    // 每次集合中实际包含的元素个数(count)超过了可包含元素的个数capcity  //的时候集合就会向内存中申请多开启一倍的空间,来保证集合长度够用 static void Main(strin ...

  6. 移动H5页面,Android手机下,input获取焦点弹出系统虚拟键盘时,挡住input解决方法

    最近在写移动端页面的时候,遇到一个问题,在Android手机下,虚拟键盘会将input框遮挡住,具体情况如下图所示: 正常页面显示  IOS端显示情况 Android端显示情况 解决方式: <t ...

  7. 从零开始的全栈工程师——html篇1.3

    文本.字体css样式与前期英语单词汇总 一.文本样式(text) 1.颜色:color:red; 2.文本对齐方式:text-align:left/center/right/justify; left ...

  8. The eighteen day

    27th Nov 2018 Setting goals is the first step in turning the invisible into the visiable   ---Tony R ...

  9. 原生js实现雪花飘落效果

    雪花飘落的效果实现步骤:1.使用setInterval定时器每800毫秒创建一个雪花:2.把每一个雪花作为参数传进动态下落的方法中即可. <style> *{padding: 0;marg ...

  10. 【阿里云产品公测】PTS压力测试服务器性能

    作者:阿里云用户xsnjxjj 在PTS服务之前,经常使用webbench来对服务器进行压力测试,在看到阿里云PTS服务的介绍以后,深深的被PTS强大的功能所吸引     非常感谢阿里云团队给予的测试 ...