原型定义:
1、原型是function对象的一个属性,它是构造函数制造出的对象的一个公有祖先,通过构造函数制造出的对象,可以继承该原型的属性和方法
2、利用原型,可以提取共有属性
3、对象查看原型的隐式属性==》 _ _ proto_ _
Person.prototype.name = "aaa";
function Person(){
// var this = {
// __proto__:Person.prototype
//}
}
var person = new Person(){};
person.construtor //指向function Person(){}
4、对象利用原型的constructor查看对象的构造函数
“[[Prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome中提供了_proto_这个非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应创建所有指向该原型的实例的构造函数
原型链*:*
1、绝大多数原型链最终都会继承自Object.prototype
2、Object.create(原型);
var obj = Object.create(原型) //这也可以创建一个对象,里面必须填原型或者null
var obj = {name:"sunny",age:123};
var obj1 = Object.create(obj); //至此obj1的原型为obj
console.log(obj1.name); //"sunny"
Person.prototpe.name = "sunny";
function Person(){
}
var person = Object.create(Person.prototype); //原型归位
//重写方法,同名不同功能
//Object.prototype.toString = function(){}
Person.prototype = {
toString : function(){
return "hehe";
}
}
function Person(){};
var person = new Person();
person.toString //"hehe"
Grand.prototype.lastname = "zeng";
function Grand(){
}
var grand = new Grand();
Father.prototype = grand;
function Father(){
this.name = "aaa";
}
var father = new Father();
Son.prototype = father;
function Son(){
this.hobbit = "smoke";
}
var son = new Son();
console.log(son.name); //"aaa";
console.log(son.lastname()); //"zeng" 逐级向上查找
//对象不能删除由原型继承来的属性和方法,只能访问查找,本对象才能删除自己的原型
undefined与null没有原型
call/apply:
call() 改变this指针方向,需要把实参按照形参的个数传进去
apply() 改变this指针方向,需要传一个arguments,只能以数组形式传进去
function Person(name,age){
this.name = name;
this.age = age;
}
var person = new Person("aaa",100);
function obj(){
}
Person.call(); //.call() 才是函数方法执行的真面目,里面可以传参
Person.call(obj) //通过call方法,使Person里的this全部指向obj,不再是默认值,改变调用对象
Person.call(obj, "bbb", 123);
obj(); //name : "bbb" age : 123;
//eg:
function test(){}; //test()执行与test.call()是等价的
比如一个应用实例:
function Person(name,age){
this.name = name;
this.age = age;
}
function Student(sex){
Person.call(this, name,age);
this.sex = sex;
} // 借用Person的方法来实现自己的功能需求
var student = new Student("aaa",111, "male");
//apply:
function Student(sex){
Person.apply(this, [name,age]);
this.sex = sex;
}