原型 原型链,call/apply

原型定义:
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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值