普通函数和构造函数

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()

原文地址:https://www.cnblogs.com/sw1990/p/5898454.html