arr=[1,3,5]
arr.toString-->"1,3,5"
var a={name:"abc"};
a.toString-->[object,object];
构造函数和普通函数
构造函数:
function Student(){}
引用var p=new Student();
执行步骤
1.先创建一个对象o
2.给对象赋值(this),执行各种操作 this.a=""
3.返回这个对象o
区别
1.函数内部会创建一个对象
2.函数内部this指向新创建的对象
3.默认返回值就是创建的对象
普通函数:
function person(){};
引用person();也可以用new person();
执行步骤
进入函数依次执行步骤
区别
1.函数内部不会创建对象
2.函数内部this指向调用函数的对象,谁调用指向谁,没有对象调用时,指向window
3.返回值由ruturn语句决定
任何函数都有prototype属性,指向它的原型
在浏览器中,几乎所有对象都有__proto__属性,原型链顶端没有
__proto__是非标准属性,不可以出现在开发中
函数的继承:
a、扩展原型对象
function Person(){
}
Person.prototype.say=function(){};
var p1=new Person();
p1.say();
p1继承了p1.__proto__对象
p1.__proto__继承了p1.__proto__.__proto__对象
...
b、替换原型对象
在原型对象加方法,通常加constructor,这样就替换了默认的prototype
c、混入继承
function extend(target,source){//mixin
for (var key in source) {
var value=source[key];
//设置目标对象的同名属性的值
target[key]=value;
}
return target;
}
d、原型+混入继承
function Student(){
}
extend(Student.prototype,{
a:function(){},
b:function(){},
c:function(){}
});
var s1=new Student();
console.log(s1.a());
e、经典继承——>Object.create()