-
创建对象的方法
创建对象的工厂模式:
function createObj(){
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}
优点:可以大批量创建对象;
缺点:一种数据类型;
var man1 = createObj('小明',20);
构造函数创建对象:
function person(name,age,action,food){
this.name = name;
this.age = age;
this.action = action;
this.work
}
存放对象的方法(放到构造函数的原型中):
var personMethod = {
eat:function(){
document.write('</br>'+this.name+'喜欢吃'+this.food);
},
study:function(){
...
}
}
优点:创建实例对象很方便,直接使用new运算符即可;方法存放在构造函数的原型对象中,实现方法共享,随用随调。
拓展:
构造函数:所有的对象都有一个constructor属性,该属性的取值就是生成该对象的构造函数。
原型(prototype):所有的函数都是对象,每个函数对象都有个属性prototype,该属性的取值也一个对象,而且该对象也是该函数的实例。
可以通过设置prototype对象的方法和属性,每个实例可以共享这些属性和方法。
-
原型和原型链
prototype
每个函数都有一个prototype属性
每一个javascript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型‘继承’属性。
function Person(){
}
//prototype是函数才会有的属性
Personprototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name)// Kevin
console.log(person2.name)// Kevin
proto
每一个javascript对象(除了null)都具有的一个属性,叫proto,这个属性会指向该对象的原型
function Person(){
}
var person = new Person();
console.log(person._proto_=== Person.prototype);// true
constructor
每个原型都有一个constructor属性指向关联的构造函数 实例原型指向构造函数
function Person(){
}
console.log(Person === Person.prototype.constructor);// true
原型与原型
var obj = new object();
obj.name = 'Kevin'
console.log(obj.name) // Kevin
原型链
console.log(object.prototype._proto_ === null) // true
小结:
javascript默认并不会复制对象的属性,相反,javascript只是在两个对象之间创建一个关联,
这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。
函数高级用法:
普通函数:
function 函数名(函数名){}
函数表达式:
var 变量名 = function(参数){} // 匿名函数
构造函数:
new 构造函数(){}
this:
函数内this指向不同场景,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
tips:在含有return的函数中,如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
function fn(){
this.user = '追梦人'
return{};
}
var a = new fn;
console.log(a.user); // undefined
function fn(){
this.user = '追梦人'
return undefined
}
var a = new fn;
console.log(a.user); //追梦人
小结:
还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。
function fn()
{
this.user = '追梦子';
return null;
}
var a = new fn;
console.log(a.user); //追梦子
call:
借用其他对象的方法
语法:
被借用对象.方法.call(借用对象,参数列表);
apply:
借用其他对象的方法(注:传参时遍历数组,一一赋给被调用方法的参数)
语法:
被借用对象.方法.apply(借用对象,【参数列表】);
bind:
复制其他对象的方法(注:bind会生成新对象,需要返回)
语法:
被复制对象.方法.bind(借用对象,参数列表);
小结:
三者之间差距很小,call,bind,apply这三个函数的第一个参数都是this的指向对象,第二个参数的差别就来了。
call的参数是直接放进去的,第二第三第n个参数用逗号隔开,直接放入后面括号。
apply的所有参数都必须放在一个数组里面传进去。
bind除了返回函数以外,它的参数和call一样。
三者的参数也不限定是字符串类型,允许是各种类型,包括函数,对象等。
举例: