apply(object,arguments)
该函数有些类似java反射中的method的invoke方法,第一个参数是指定调用该method的对象,第二个参数是该method需要的参数列表,arguments需要是一个数组
call(object[,”arg1″[,”arg2″][,”arg3″]…])
该函数用法与apply用法一样,只是他的参数可以是以逗号隔开的形式
js中定义function的三种方法
第一种:
function funcName([“arg1″…[,”argN”]])
{
statement;
}
第二种:
var func = new Function([“arg1”,…[“argN”],”statement1;..[statementN]”]);
第三种:
obj.handler = function([“arg1″…[,”argN”]])
{
statement;
}
js中创建对象的二种方法
第一种:
function constructorName([“arg1″…[,”argN”]])
{
statement;
}
var obj = new constructorName([“arg1″…[,”argN”]]);
这种方式创建对象可以看到,就是new一个function
第二种:
var obj = {propName1: propValue1[,propName2: propValue2 … [,propNameN: propValueN]]}
以上两种方式定义的对象,对象的属性能够以obj.propName访问到,也能够以obj[propName]访问到。
prototype源码学习
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
当 调用Class.create(),返回一个function,该function中有一句this.initialize.apply(this, arguments); 这时候new一下function得到一个实例,此处this就代表这个实例,第一个this的作用指定了一个命名空间,指出 initialize的所在,第二个this是initialize方法运行时的当前对象设置为前面的实例。
Object.prototype.extend = function(object) {
for (property in object) {
this[property] = object[property];
}
return this;
}
此处模拟了java中的继承机制,由于js中所有对象都直接或者简介的继承自Object,所以任何Object的实例化对象都可以使用extend方法来继承其他的对象。
例如:假设现在已经有function(类)Object1和Object2
var obj1 = new Object1();
var obj2 = new Object1();
则可以运用obj1.extend(obj2);
此时obj1将拥有obj2的所有属性(方法)。
不 仅仅可以直接再对象之间进行继承,也可以在更高一层的function(类)之间进行继承,因为所有的function(类)都有一个prototype 对象,所以可以用Object1.prototype.extend(Object2.prototype)这样一来所有Object1的实例化对象都可 以拥有Object2的属性(方法)。可以这样理解
Object1.prototype是一个对象,这个对象是Object的实例,而现在给Object加入了一个extend方法,所以它也拥有了extend方法。
注意:在prototype较新的版本中去掉了上面的方法,而是直接使用下列方法:
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
所有需要运用到继承的地方都直接使用Object.extend方法,这个方法相当于一个静态的拷贝属性的方法,这个方法较之上面的方法的好处在于,它不会给继承的对象带来一个新的extend属性(方法),能够比较干净的实现继承。
Leave a Reply