JavaScript高级程序设计13.pdf
使用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的更多相关文章
- JavaScript高级程序设计39.pdf
第13章 事件 JavaScript与HTML之间的交互式通过事件来实现的. 事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出了完全相反的事件流概念,IE是事件冒泡流,Nets ...
- JavaScript高级程序设计61.pdf
JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...
- JavaScript高级程序设计60.pdf
错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...
- JavaScript高级程序设计58.pdf
15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...
- JavaScript高级程序设计57.pdf
表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...
- JavaScript高级程序设计55.pdf
输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...
- JavaScript高级程序设计54.pdf
过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...
- JavaScript高级程序设计53.pdf
共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...
- JavaScript高级程序设计52.pdf
表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...
随机推荐
- (一)问候Struts2
第一节:Struts2 简介 主页:http://struts.apache.org/在用户请求和模块化处理方面以及页面的展现这块,Struts2 发挥的屌炸天作用:相对于传统的Jsp+Servlet ...
- OC细节 - 1.深拷贝与浅拷贝详解
概述 拷贝:复制一个与源对象内容相同的对象 实现拷贝,需要遵守以下两个协议 NSCopying NSMutableCopying 拷贝返回对象的种类 可变,mutableCopy消息返回的对象 不可变 ...
- 通过html5的range属性动态改变图片的大小
range属性已经是很成熟的属性了,我们可以使用这个属性进行动态调整图片的宽度,其中原理在于通过不断获取range的值,并赋予给所需要的图片,进而达到动态改变图片的效果.下面贴出具体的代码,主要参照了 ...
- .NET开源工程推荐(Accord,AForge,Emgu CV)
本人用C#开发了一些项目,下面的开源工程给了我很大的帮助——详细的源代码介绍加丰富的实例运用,是非常不错的学习资源,分享给大家,同时附上我的相关开发项目. Accord.NET The ...
- js 组件的写法
var Test1 = function(){ var name = ""; this.setName = function(username){ name = username; ...
- JqGrid实现自定义查询
$("#jqGridId").setGridParam({url:"数据查询地址"}).trigger("reloadGrid");
- Chromium网页Frame Tree创建过程分析
Chromium在加载一个网页之前,需要在Browser进程创建一个Frame Tree.Browser进程为网页创建了Frame Tree之后,再请求Render进程加载其内容.Frame ...
- UEditor配置图片上传
最近项目中需要用到一个图文编辑器功能,因为之前的kingeditor功能过于简陋,所以决定换成Ueditor,前端已经配置好了,这个是后台配置 1,确定前台已经配置好了 2,将编辑器的插件包下载下来, ...
- fedora22 无法联网的情况下rpm安装gcc5.1
前天发生件很不幸的事.我在给ubuntu14.04安装NVIDIA显卡驱动的时候,想清空下一个目录,什么目录我也忘了,当时我正好切到root身份(平常我很少切root的),命令格式如下 rm -fr ...
- 深入了解join用法
最近面试经常被问到inner join, right join , left join 今晚决定搞清楚这些: 首先先创建两个表: CREATE TABLE Persons ( Id_P int NO ...