学习Javascript原型笔记(一)

来源:互联网 发布:淘宝联盟官方发单助手 编辑:程序博客网 时间:2024/04/29 01:11

最近在学JavaScript的原型,发现比较难理解,记下笔记以后多回来看,巩固基础:

1.在JavaScript中,所有函数都会有一个prototype对象属性,该函数被new操作符调用时会创建出一个对象,并且该对象中会有一个指向其原型对象的神秘链接。通过该神秘链接(某些环境中,该链接名为proto),我们就可以在新建的对象中调用相关原型对象的方法和属性。最开始创建函数时prototype属性所存储的就是原型对象,默认初始值为空对象。

2.每个对象都有一个构造器,而原型本身也是一个对象,这意味着它也必须有一个构造器,而这个构造器又会有自己的原型。

3.如果在一个对象自身属性中没有找到指定的属性,就可以去(如果存在的话)原型链中查找相关的属性。

4.对象自身属性的优先级高于原型属性。

5.并不是所有的属性都会在for-in循环中显示。例如(数组的)length属性和constructor属性就不会显示。那些已经被显示的属性被称为可枚举的,我们可以通过各个对象所提供的propertyIsEnumerable()方法来判断其中有哪些可枚举的属性。

6.原型链中的各个原型属性也会被显示出来,当然前提是它们是可枚举的。我们可以通过对象的hasOwnProperty()方法来判断一个属性是对象自身属性还是原型属性。

7.对于所有的原型属性,propertyIsEnumerable()都会返回false,包括那些在for-in循环中可枚举的属性。

8.每个对象中都有一个isPrototypeOf方法,这个方法会告诉我们当前对象是否是另一个对象的原型。

9.proto与prototype并不是等价的。proto实际上是某个实体对象的属性,而prototype则是属于构造器函数的属性。

10.当我们对原型对象执行完全替换时,可能会触发原型链子中某种异常(exception)。

11.prototype.constructor属性是不可靠的。

12.我们可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象

扩展内建对象
PHP中有一个叫做in_array()的函数,主要用于查询数组中是否存在某个特定的值。Javascript中则没有一个叫做inArray()的方法,我们可以通过Array.prototype来实现一个:

if(!Array.prototype.inArray){  //先检查一下该属性是否存在    Array.prototype.inArray = function(needle){        for(var i = 0,len=this.length;i<len;i++){            if(this[i]===needle){                return true;            }        }        return false;    }}

这样,所有的数据对象都有一个新方法了,测试一下:

var a = ['red','green','blue'];a.inArray('red');//truea.inArray('yellow');//false

扩建String使其有反转字符串的功能:

if(!String.prototype.reverse){  //先检查一下该属性是否已经存在    String.prototype.reverse = function(){        return Array.prototype.reverse.apply(this.split('')).join('');    }}"Stoyan".reverse();//"nayotS"
0 0
原创粉丝点击