第六章
面向对象的程序设计

1.定义只有在内部才用的特性(attribute)时,描述了属性(property)的各种特征。这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。为了表示特性是内部值,该规范把它们放在了两对方括号中,例如[[Enumerable]]。

2.数据属性

  [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,默认为true,一旦改为false不能再把它变回可配置了。

  [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true。

  [[Writable]]:表示能否修改属性的值,默认为true。

  [[Value]]:包含这个属性的数据值,默认为undefined,只可读。

3.要修改属性默认的特性,必须使用ES5的Object.definePropert()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。

4.访问器属性

  [[Configurable]]

  [[Enumerable]]

  [[Get]]:在读取属性时调用的函数。默认undefined

  [[Set]]:在写入属性时调用的函数。默认undefind

访问器属性不能直接调用,必须使用Object.defineProperty()

_year,起那么加下划线是一种常用的标记,用于表示只能通过对象方法访问的属性。

5.工厂模式

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,"Software Engineer");
var person = createPerson("Grey",27,"Doctor");

6.构造函数模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas",29,"Software Engineer"); var person2 = new Person("Nicholas",29,"Software Engineer");

跟工厂模式的区别:1.没有显示地创建对象 2.直接将属性和方法赋给了this对象 3.没有return语句

7.创建一个实例经过的步骤

  1.创建一个新对象

  2.将构造函数的作用域赋给新对象(因此this就指向了这个新对象)

  3.执行构造函数中的代码(为这个新对象添加属性)

  4.返回新对象

8.person1根person2保存着不同的实例,但是两个对象都有一个constructor(构造函数)属性,指向Person

  person1 instanceof Person == true

创建自定义构造函数意味着将来可以将它的实例标识为一种特定的类型,而这正是构造函数模式胜于工厂模式的地方

9.创建的每一个函数都有一个prototype(原型)属性。

使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必再构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。

10.代码读取属性时候,如果在实例中找到了具有给定名字的属性,则返回该属性的值,如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。

11.

function Person(){
}
var friend = new Person();
Person.prototype = {
constructor:Person,
name: "Nicholas",
age : 29,
job : "Student"
sayName : function(){
alert(this.name);
}
};
friend.sayName();

重写原型对象切断了现有原型与任何之前已经存在的对象之间的联系;它们的引用任然是最初的原型。

搞错 不应该报这个错误,原因是我在上面的job的后面少了个,所以导致出现这个错误,是语法错误的意思

改完后

12.不建议修改原生对象的原型,因为不同分支如果都重写,可能造成命名冲突。

13.原型对象的最大问题是其共享的本性所导致。

14.组合使用构造函数模式和原型模式,每一个实例都会有自己的一份实例属性的副本,但同时又共享着对方的引用了,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数。

        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("zs", 12, "student");
var person2 = new Person("ls", 11, "doc");
person1.friends.push("van");
alert(person1.friends);//shelby,count,van
alert(person2.friends);//shelby,count
alert(person1.friends === person2.friends);//false
alert(person1.sayName === person2.sayName);//true

15.and 寄生构造函数模式,稳妥构造函数模式。instanceof操作符对这种对象都没意义。

16.javascript的继承主要依靠原型链来实现,

比如,1,先搜索实例  2,往上层原型搜索 3,往更上层原型搜索

17.原型链的问题也是原型属性实例共享。解决这个问题用借用构造函数。(这两种技术都很少单独使用)

18.组合继承

function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"]
}
SuperType.prototype.sayName = function(){
alert(this.name);
}
function SubType(name, age){
// 继承属性
SuperType.call(this,name);
this.age = age;
}
// 继承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
}; var instance1 = new SubType("Nicholas",29);
instance1.colors.push("black");
alert(instance1.colors); // "red,blue,green,black"
instance1.sayName(); // "Nicholas"
instance1.sayAge(); // var instance2 = new SubType("Grey",27);
alert(instance2.colors); // "red,blue,green,black"
instance2.sayName(); // "Grey"
instance2.sayAge(); //

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为js中最常用的继承模式。而且instanceof 和isPrototypeof()也能够用于识别基于组合继承创建的对象。

JavaScript高级程序设计(第三版) 6/25的更多相关文章

  1. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  2. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  3. 22.1 高级函数【JavaScript高级程序设计第三版】

    函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...

  4. DOM 操作技术【JavaScript高级程序设计第三版】

    很多时候,DOM 操作都比较简明,因此用JavaScript 生成那些通常原本是用HTML 代码生成的内容并不麻烦.不过,也有一些时候,操作DOM 并不像表面上看起来那么简单.由于浏览器中充斥着隐藏的 ...

  5. 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】

    IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...

  6. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  7. 14.5 富文本编辑【JavaScript高级程序设计第三版】

    富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...

  8. JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

    null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...

  9. 4.2 执行环境及作用域【JavaScript高级程序设计第三版】

    执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环 ...

  10. 13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】

    鼠标事件是Web 开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.DOM3 级事件中定义了9 个鼠标事件,简介如下. click:在用户单击主鼠标按钮(一般是左边的按钮)或者按下回车键时触发.这 ...

随机推荐

  1. 【Oracle】如何让一个用户能够访问另外一个用户下所有的表

    根据需求的不同,也分为好几种方法,且看下文. 先构造基本的环境:创建两个用户AA,BB,基本需求为用户AA能够访问用户BB下所有的表,即用户AA有对BB下所有的表有"select on&qu ...

  2. java语言基础(六)_String类_static_Arrays类_Math类

    String类 1. 使用 java.lang.String类代表字符串.lang包含的包不用特意引用,即默认已经引用了. API当中说:Java 程序中的所有字符串字面值(如 "abc&q ...

  3. CSS通过text-transform实现大写、小写和首字母大写转换

    再日常项目中可能会用到一些特殊的样式,比如大写字母转小写.小写字母转大写.首字母大写等. 可以通过 CSS 的 text-transform 属性来实现: text-transform 转换不同的文本 ...

  4. html5中contenteditable 光标_如何设置光标位置

    在js中,光标是一个对象,当你选中某个元素的时候才会出现光标对象.比如:我们点击一个输入框,实际会产生一个选中对象-selection,这个对象我们可以通过indow.getSelection()来获 ...

  5. 「疫期集训day7」周期

    我们成功入侵了圣康坦,屋子里到处都是面包,食物,水...现在我们的目标就在眼前----亚眠------鲁道登夫攻势中损失惨重的德国精英兵 今天考试考出了历史最低,原因在于T1签到题挂了,ull真的毒瘤 ...

  6. centos7篇---开启防火墙和特定端口

    开启防火墙服务 以前为了方便,把防火墙都关闭了,因为现在项目都比较重要,害怕受到攻击,所以为了安全性,现在需要将防火墙开启,接下来介绍一下步骤.1, 首先查看防火墙状态: firewall-cmd - ...

  7. Redis的主从复制(基本入门)

    描述 从主节点(主机)到从节点(从机)单向的数据复制 特性(主从复制是Redis高可用的基础) 数据冗余 故障恢复 负载均衡 读写分离(主节点有读写权限,从节点只有读的权限) 注:以下操作都是在cen ...

  8. 小白pytorch安装以及初步了解

    安装遇到的几个坑: 1创建虚拟环境的时候出现Proceed ([y]/n)? 询问你是否覆盖旧版本,在命令行输入y即可进行下一步的安装操作了 安装pytorch前先了解 pytorch:一个开源pyt ...

  9. python 读取指定文件夹中的指定文件类型的文件名

    import numpy as np import os path = 'F:\\wenjian'#指定文件所在路径 filetype ='.csv'#指定文件类型 def get_filename( ...

  10. linux专题(九):磁盘管理

    http://dwz.date/UDf 概述 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用命令为 df.du. df :列出文件系统的整体磁盘使用量 du:检查磁盘空间 ...