使用hasOwnProperty()方法检测一个属性存在实例还是原形中,当属性存在对象实例中时,返回true

alert(person1.hasOwnProperty("name"));  //false 来自原型

原型和in操作符

单独使用和for-in中,单独使用时无论属性存在于实例中还是原型中都返回true

ECMAScript 5的Object.keys()方法,接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组(参数是实例则返回实例的属性,是原型则返回原型的属性)

var keys=Object.keys(Person.prototype);

alert(keys);  //"name,age,job,sayName"

得到所有实例属性,无论它是否可枚举用Object.getOwnPropertyNames()方法

var keys=Object.getOwnPropertyNames(Person.prototype);

alert(keys);

用一个包含所有属性和方法的对象字面量来重写整个原型对象

function Person(){};

Person.prototype={

    name:"Nicholas",

    age:29,

    job:"Software Engineer",

    sayName:function(){

      alert(this.name);

      }

};

因为我们完全重写了原型对象,因此它的constructor属性不再指向Person了,而是指向Object构造函数,此时通过constructor已经无法确定对象的类型了

var friend=new Person();

alert(friend instanceOf Object);  //true继承自Object

alert(friend instanceOf Person);  //true

alert(friend.constructor ==Person);  //false

alert(friend.constructor ==Object);  //true

如果constructor的值很重要
function Person(){}

Person.prototype={

    constructor:Person,

    name:"Nicholas"

    };  //注意,这样操作以后会导致它的[[Enumerable]]特性设置为true,变为可枚举属性

  //重写prototype

Person.prototype={

    name:"Nicholas",

    age:29

    };

  //添加prototype属性

Person.prototype.sayHi=function(){

  alert("hi");

};

由于原型的动态性,我们对原型的任何修改能在实例中反映出来

通过构造函数创建一个实例后,这个实例的[[Prototype]]指针指向最初原型,如果重写整个原型对象会切断这个实例与原型之间的联系,造成错误

原型模式的重要性不见体现在创建自定义类型方面,原生引用类型(Object、Array、String)等等都在其构造函数的原型上定义了方法

alert(typeof Array.prototype.sort);  //"function"

可以自定义方法

String.prototype.startsWith=function (text){

    return this.indexOf(text)==0;

};

var msg="hello world!";

alert(msg.startsWith("hello"));  //true

原型模式的共享是一个优点,却也是一个问题,假如我们通过实例修改原型那么另一个指向这个原型的实例也会反应出这样的修改

组合使用构造函数模式和原型模式,构造函数模式存私有属性,原型模式存共有属性

function Person(name,age,job){

    this.name=name;

    this.age=age;

    this.job=job;

    this.friend=["ShelBy","Court"];

    }

Person.prototype={

    constructor:Person,

    sayName:function(){

      alert(this.name);

        }

}

var person1=new Person("Nicholas",29,"Software Engineer");

var person2=new Person("Greg",27,"Doctor");

person1.friends.push("Van");

alert(person1.friends);  //"ShelBy,Court,Van"

alert(person2.friends);  //"ShelBy,Court"

动态原型模式

在构造函数中封装所有信息,后面再检测某个方法是否有效,无效的话再次添加到原型中

寄生构造函数模式

创建一个对象,封装对象的代码,返回新创建的对象,在调用本模式时加new操作符

稳妥构造函数

不引用this,不使用new调用构造函数,返回对象

JavaScript高级程序设计13.pdf的更多相关文章

  1. JavaScript高级程序设计39.pdf

    第13章 事件 JavaScript与HTML之间的交互式通过事件来实现的. 事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出了完全相反的事件流概念,IE是事件冒泡流,Nets ...

  2. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  3. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  4. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  5. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  6. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  7. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  8. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  9. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

随机推荐

  1. Android Studio美化之优雅的logcat

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 先来个图,图样吐sexy: 很简单,跟我走吧,两步: 1. 引入Logger库 首先,这个sexy ...

  2. 数据库(学习整理)----3--Oracle创建表和设置约束

    BBS论坛表设计 包含的表:BBSusers(用户表),BBSsection(版块表),BBStopic(主贴表),BBSreply(跟帖表) 表结构 1)BBSusers 字段名 字段说明 数据类型 ...

  3. [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD

    一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...

  4. 10个必看的PHP小代码,很实用!

    获取浏览器IP地址 function getRemoteIPAddress() { $ip = $_SERVER['REMOTE_ADDR']; return $ip; } 如果有代理服务器的情况下获 ...

  5. PHP实战开发教程

    对于PHP初学者来说,一上手就学习庞大的PHP语法无疑很打击自信心.其实即便是很熟练的程序员,也未必对所有的语法非常熟悉.通常熟练的程序员比普通的程序员的优势在于对基本语法的理解非常透彻,而且常用的一 ...

  6. Oracle数据库常用函数

    Oracle常用函数: 20.COS返回一个给定数字的余弦SQL> select cos(-3.1415927) from dual;COS(-3.1415927)--------------- ...

  7. resolvconf: Error: /etc/resolv.conf isn't a symlink, not doing anything.

    一.问题出现的原因 resolv.conf默认是个软链接,resolvconf默认会检查resolv.conf不是软链接就报错 默认的情况是这样的: #ls -l /etc/resolv.conflr ...

  8. uboot环境变量初始化

    一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...

  9. codevs 1066 引水入城

    传送门 题目描述 Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政 区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 ...

  10. iOS:等待控件

    定义: @interface ViewController () { UIActivityIndicatorView *testActivityIndicator; } 实例化,开始旋转: -(voi ...