zoukankan      html  css  js  c++  java
  • 渡一——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)
  • 相关阅读:
    Longest Palindromic Substring
    PayPal MLSE job description
    Continuous Median
    Remove Duplicates From Linked List
    Valid IP Address
    Longest substring without duplication
    Largest range
    Subarray sort
    Multi String Search
    Suffix Trie Construction
  • 原文地址:https://www.cnblogs.com/lisa2544/p/15307248.html
Copyright © 2011-2022 走看看