javascript 高级程序设计学习笔记(面向对象的程序设计) 1
Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码。
工厂模式
//工厂模式
function createDog (name,age) {
var o = new Object();
o.name = name;
o.age = age;
o.sayAge = function () {
alert(age);
};
return o; }
var dog1 = createDog("Bob","11");
var dog2 = createDog("Ann","5");
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
构造函数模式
//构造函数模式
function Dog (name,age) {
this.name = name;
this.age = age;
this.sayAge = function () {
alert(age);
};
}
var dog1 = new Dog("Bob","11");
var dog2 = new Dog("Ann","5");
这个例子中直接将方法和属性赋给了this对象。此时函数名Dog使用的D是大写字母,构造函数始终应该以一个大写字母开头,这主要是为了区别于ES中的其他函数;因为构造函数本身也是函数,只不过可以用来创建对象而已。
创建构造函数的新实例,必须使用 new 操作符。
以下为创建步骤
1.创建一个新对象;
2.将构造函数的作用域赋给新对象(this指向新对象);
3.执行构造函数的代码;
4.返回新对象。
dog1和dog2分别保存着Dog的一个不同的实例。这两个对象都有一个constructor(构造函数)属性,该属性指向Dog。
alert(dog1.constructor == Dog); //true
alert(dog2.constructor == Dog); //true
constructor属性最初是用来标识对象类型的。检测对象类型还是用instanceof操作符更靠谱一些。
alert(dog1 instanceof Object) //true alert(dog1 instanceof Dog) //true
Dog1同时也是Object的实例,是因为所以对象均继承自Object。
构造函数也可以作为普通函数来调用
//作为普通函数
Dog("Bob","11");
window.sayAge(); //"11"
//在另一个对象作用域中调用
var o =new Object();
Dog.call(o,"Bob","11");
o.sayAge(); //
构造函数的弊端:
每个方法都要在每个实例上重新创建一遍,这样会占用更多的内存,影响效率。
以这种方式创建的函数,会导致不同的作用域链和标识符解析。因此不同的实例上命名的函数是不相等的。
alert(dog1.sayAge == dog2.sayAge) //false
原型模式
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。
使用prototype对象的好处是不必再构造函数中定义对象实例的信息,而是将这些信息直接添加到prototype对象中。
function Dog(){}
Dog.prototype.name = "Bob";
Dog.prototype.age = "11";
Dog.prototype.jump = function(){alert("跳一下");};
var dog1 = new Dog();
dog1.jump(); //跳一下
var dog2 = new Dog();
dog2.jump(); //跳一下
alert(dog1.name);
alert(dog1.jump == Dog2.jump); //true
原型对象的验证
isPrototypeOf():
在创建自定义构造函数后,原型对象默认只会却constructor属性;其他方法从Object继承而来。当调用构造函数创建新实例后,该实例内部将包含一个指针
指向原型对象。但这个属性对脚本是完全不可见的,它存在于实例与构造函数的原型对象之间。
此时可以通过isPrototypeOf()方法来确定。
alert(Dog.prototype.isPrototypeOf(dog1)); //true
Object.getPrototypeOf():
alert(Object.prototypeOf(dog1) == Dog.prototype); //true
alert(Object.prototypeOf(dog1).name); //"Bob"
该方法可以取得对象的一个原型。
hasOwnProperty():
hasOwnProperty()方法可以检测一个属性是存在于实例中,还是原型中。
function Dog(){}
Dog.prototype.name = "Bob";
Dog.prototype.age = "11";
Dog.prototype.jump = function(){alert("跳一下");};
var dog1 = new Dog();
var dog2 = new Dog();
alert(dog1.hasOwnProperty("name")); //false
dog1.name = "Gina";
alert(dog1.name); //"Gina"
alert(dog1.hasOwnProperty("name")); //true
alert(dog2.hasOwnProperty("name")); //false--来自原型
所以,只有给定属性存在于对象实例中才会返回true,这里dog1的name被一个新值屏蔽了。
in操作符
alert("name" in dog1) //true
name属性不管是在对象上访问到的,还是在原型中访问到的都会返回true。要想确定属性到底存在于对象中还是原型中可以使用以下代码
function hasPrototypeProperty (object,name) {
return !object.hasOwnProperty(name) && (name in object);
}
使用for-in循环可以得到所有能够通过对象访问的、可枚举的属性。
javascript 高级程序设计学习笔记(面向对象的程序设计) 1的更多相关文章
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...
- JavaScript高级程序设计学习笔记--面向对象程序设计
工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. f ...
- javascript高级程序设计读书笔记----面向对象的程序设计
创建对象 工厂模式 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = ...
- Javascript高级编程学习笔记(18)—— 引用类型(7)单体内置对象
什么是内置对象呢? js高级程序设计中给出的定义为:由ES规定不依赖于宿主环境的对象,这些对象在JS执行前就已经存在 前面我们介绍的引用类型都是内置对象 除了这些对象外ECMA还规定了两个单体内置对象 ...
- Javascript高级编程学习笔记(10)—— 作用域、作用域链
昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...
- Javascript高级编程学习笔记(3)—— JS中的数据类型(1)
前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...
- JavaScript高级编程学习笔记(第三章之一)
继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...
- Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)
错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用 gl.getError() 方法 该方法会返回以 ...
- Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)
WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...
- Javascript高级编程学习笔记(96)—— WebGL(2) 类型化视图
类型化视图 类型化视图一般也被认为是一种类型化数组. 因为其元素必须是某种特定的数据类型,类型化视图都继承自 Dataview Int8Array: 表示8位二补整数(即二进制补数) Uint8Arr ...
随机推荐
- OpenGL ES 2.0 限定符
限定符 说明 作用 attribute 一般用于各个顶点各不相同的量,如顶点位置.颜色等 属性限定符,修饰的变量用来接收渲染管线传递进顶点着色器的当前顶点的各种属性值. 只能用来修饰符点数标量,浮点数 ...
- hdu Counting Sheepsuanga
算法:深搜 题意:让你判断一共有几个羊圈: 思路:像四个方向搜索: Problem Description A while ago I had trouble sleeping. I used to ...
- 三组I/O复用模型的比较
概论: select.poll和epoll三组I/O复用系统调用,这3组系统调用都能同时监听多个文件描述符.它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回. ...
- 【干货】.NET开发通用组件发布(四) 日志记录组件
组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...
- 云风:我所偏爱的C语言面向对象编程范式
面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI 框架,又比如 3d 渲染引擎中的场景管 ...
- 让libvirt支持win7运行2核以上
现在人在部署OpenStack之后会发现按照配额运行Linux的虚拟机没有问题,但是运行windows的虚拟机会发现如果配置2个以上的核则无法识别,windows server也最多支持到4个核.无法 ...
- Unix/Linux环境C编程入门教程(40) 初识文件操作
1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...
- Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...
- windows下搭建NFS服务器
Win7除了旗舰版和企业版其他版本没有NFS客户端,windows2000,windowsXP,windows2003有个sfu(windows services for unix)工具貌似比较强大, ...
- C# 文件夹操作
追加文件 StreamWriter sw = File.AppendText(Server.MapPath(] != Path.DirectorySeparatorChar) a ...