渡一——11-2原型,原型链,call/apply(下)

认识proto

Person.ptototype.name = 'abc';
function Person(){
    /*var _private //私人属性
    __proto__系统属性*/

    var this = {
        __proto__ : Person.prototype
    }
}
var person = new Person();
person.__proto__//系统属性
Person.prototype.name = 'sunny';
function Person(){
    var this = {__proto__ : Person.prototype}
}
var person = new Person();
Person.prototype = {//从新开了一个空间
    name : "cherry"
}

person.name //sunny
Person.name //cherry


var obj = {name:'a'};
var obj1 = obj;
obj = {name:'b'}//新开空间

obj.name //b
obj1.name //a

Person.prototype = {name:'a'};
__proto__ = Person.prototype;
Person.prototype = {name:'b'};
Person.prototype.name = 'sunny';
function Person(){
    // var this = {__proto__ : Person.prototype}
}
//这次是直接就改了,如果在下面就是指向后再修改
Person.prototype = {//从新开了一个空间
    name : "cherry"
}
var person = new Person();
person.name //cherry

原型链
1.如何构成原型链
2.原型链上属性的增删改查
3.绝大多数对象的最终都会继承自Object.prototype;
4.Object.create(原型)

// Grand.ptototype.__proto__ = Object.prototype //最终
Grand.ptototype.lastName = "Deng";
function Grand(){

}
var grand = new Grand();

Father.prototype = grand;
function Father(){
    this.name = "xuming"this.fortune = {
        card1 : 'visa'
    }
    this.num = 1;
}
var father = new Father();

Son.prototype = father;
function Son(){
    this.hobbit = "smoke"
}
var son = new Son();

son.hobbit //smoke
son.name //xumin
son.lastName //Deng

son.fortune.card2 = 'master' //修改父亲

son.num++;
father.num //100;
son.num //101 取出来变成自己的属性
Person.ptototype = {
    name : 'a',
    sayName : function(){
        console.log(this.name);
    },
    height:100
}

function Person(){
    this.name = "b";
    this.eat = function (){
        this.height ++;
    }
}

var person = new Person();
person.sayName();//b
Person.ptototype.sayName() //a

person.eat();//height:101 取出来变成自己的属性

create指定原型创建对象

var obj = {};
var obj1 = new Object();
// obj1.__proto__ ----> Object.prototype;


Object.create
// var obj = object.create(原型)
var obj = {name:"sunny",age:123}
var obj1 = Object.create(obj);
obj1.name //sunny

Person.prototype.name = 'sunny';
function Person(){
    // var this = {__proto__ : Person.prototype}
}
var person = new Person();
var person = Object.create(Person.prototype);//用Person上的原型来创建person
person.name //sunny

Object.create(null);


var obj = Object.create(null);//与Object.prototype原型断开
// obj.__proto__ = Object.prototype

 toStirng方法

//每个包装类都改写了自己的toString()方法
Object.prototype.toStirng
Number.prototype.toStirng
Array.prototype.toStirng
Boolean.prototype.toStirng
String.prototype.toStirng

Number.prototype.toString = function(){
    return "老邓身体好";
}
var num = 123;
num.toString() //"老邓身体好"


// var obj ={};
var obj = Object.create(null)//断开了Object.__prototype__.toString()方法
document.write(obj)//报错 document.write调用了Object原型上的Object.toString()方法


var obj = Object.create(null)
obj.toString = function(){
    return "老邓身体好";
}
document.write(obj); //"老邓身体好"

call&apply改变this指向,传参不同

function Person(name,age){
     //this == obj
     this.name = name;
     this.age = age
 }
 var person = new Person('deng',100);
 var obj = {}
 Person.call(obj,'cheng',300);
 obj //{name:'name',age:300}

 function test(){}
 test ----> test.call()


 function Person(name,age,sex){
     this.name = name;
     this.age = age;
     this.sex = sex;
 }

 function Student(name,age,sex,tel,grade){
     Person.call(this,name,age,sex );
     this.tel = tell;
     this.grade = grade;
 }

 var student = new Student('sunny',123,'male',139,2017)
function Wheel(wheelSize,style){
     this.style = style;
     this.wheelSize = wheelSize;
 }

 function Sit(c,sitColor){
     this.c = c;
     this.sitColor = sitColor
 }
 function Model(height,width,len){
     this.height = height;
     this.width = width;
     this.len = len;
 }
 function Car(wheelSize,style,c,sitColor,height,width,len){
     Wheel.call(this,wheelSize,style); //借腹生子
     Sit.call(this,c,sitColor);
     Model.call(this,height,width,len);
 }
 var car = new Car(100,'好看','真皮',"red",1800,1900,4900);

Object.prototype.toString.call()方法

Object.prototype.toString.call(arr) == '[object Array]'

//利用tostring方法判断类型--类似instanceof typeof功能

下面这种情况只能用Object.prototype.toString.call()方法

window.onload = function(){
    var oF = documnet.createElement('iframe');
    document.body.appendChild( oF );
    var ifArray = window.frame[0].Array;
    var arr = new ifArray();
    
    arr.constructor == Array

    arr instanceof Array

    Object.prototype.toString.call(arr) == '[object Array]'
}

apply
call 需要把实参按照形参的个数传进云
apply 需要传一个arguments

 // Wheel.apply(this,[wheelSize,style]);
 // Wheel.apply(this,arguments);


function foo(){
    bar.apply(null,arguments)
}
function bar(x){
    console.log(arguments)
}
foo(1,2,3,4,5)
原文地址:https://www.cnblogs.com/lisa2544/p/15307248.html