zoukankan      html  css  js  c++  java
  • 第198天:js---内置对象的原型链和其他知识

    一、内置对象的原型链

    1、Object原型

     1 function test() {}
     2    alert(test.toString());
     3    
     4    //新增属性
     5    Object.prototype.mytest = function() {
     6        alert("123");
     7    }
     8    var o = new Object();
     9    o.mytest();
    10    
    11    //重写属性
    12     Object.prototype.toString = function()
    13    {
    14        alert("破坏之王");
    15    }
    16    o.toString();

    2、Object对象是Function对象的实例

     1 /*object的__proto__指向Function对象的原型*/
     2     //Object对象是Function对象的一个实例
     3     console.log(Object.__proto__ === Function.prototype);//true
     4 
     5     /*Function.prototype对象的原型的__proto__属性指向Object.prototype*/
     6     console.log(Function.prototype.__proto__ === Object.prototype)
     7 
     8     /*object的原型的__proto__属性为null*/
     9     console.log(Object.prototype.__proto__ )
    10 
    11 
    12     /*总结*/
    13     /*一个自定义对象可以访问到Function对象的所有属性和方法,也可以访问到Object对象的所有属性和方法*/

    3、内置对象的实例指向

     1 //Object对象是Function对象的一个实例
     2    //Object对象的__proto__指向Function的原型
     3    console.log(Object.__proto__===Function.prototype);//true
     4 
     5    console.log(Object.prototype.__proto__);//null
     6 
     7    console.log(Function.prototype.__proto__===Object);//false
     8    console.log(Function.prototype.__proto__===Object.prototype);//true
     9 
    10    //内置对象的_proto_的指向
    11    console.log(Number.__proto__ ===Function.prototype);//true
    12    console.log(Boolean.__proto__ ===Function.prototype);//true
    13    console.log(String.__proto__ ===Function.prototype);//true
    14    console.log(Object.__proto__ ===Function.prototype);//true
    15    console.log(Function.__proto__ ===Function.prototype);//true
    16    console.log(RegExp.__proto__ ===Function.prototype);//true
    17    console.log(Error.__proto__ ===Function.prototype);//true
    18    console.log(Date.__proto__ ===Function.prototype);//true
    19 
    20 
    21    //自定义对象的原型的__proto__指向
    22    function Product(){};
    23 
    24    Product.prototype={};
    25 
    26    var iphone=new Product();
    27    console.log(Product.prototype.__proto__);//object
    28    console.log(Product.prototype.__proto__===Object.prototype);//true
    29 
    30    //构造函数就是一个函数,函数都是由Function实现的,都是它的一个实例
    31    console.log(Product.__proto__===Function.prototype);//true
    32 
    33    var obj = new Object();
    34    //toString是object的方法,因为在原型中,所以所有对象都可以访问
    35    //Object.prototype.toString=function(){};
    36    console.log(obj.toString());//[object Object]
    37 
    38    /*object的实例指向Object的原型对象*/
    39    console.log(obj.__proto__ === Object.prototype);//true

    4、自定义对象的原型链

     1 //object的__proto__指向的是Function.prototype
     2     console.log(Object.__proto__ ===Function.prototype)
     3 
     4 
     5     /*null*/
     6     console.log(Object.prototype.__proto__);
     7 
     8 
     9     /*object*/
    10     console.log(Function.prototype.__proto__ === Object) //false
    11     console.log(Function.prototype.__proto__ === Object.prototype)  //ture
    12 
    13 
    14     /*内置对象的__proto__指向*/
    15     console.log(Number.__proto__ === Function.prototype)  // true
    16     /*
    17     Boolean.__proto__ === Function.prototype // true
    18     String.__proto__ === Function.prototype  // true
    19     Object.__proto__ === Function.prototype  // true
    20     Function.__proto__ === Function.prototype //true
    21     Array.__proto__ === Function.prototype   // true
    22     RegExp.__proto__ === Function.prototype  // true
    23     Error.__proto__ === Function.prototype   // true
    24     Date.__proto__ === Function.prototype    // true*/
    25 
    26 
    27     /*自定义对象的原型的__proto__指向*/
    28     function Product(){}
    29 
    30     Product.prototype={}
    31 
    32     var iphone = new Product()
    33 
    34     console.log(Product.prototype.__proto__)
    35     console.log(Product.prototype.__proto__ === Object)  //false
    36     console.log(Product.prototype.__proto__ === Object.prototype) //true
    37 
    38     var obj = new Object()
    39 
    40    /* Object.prototype.toString=function(){
    41         alert('破坏之王')
    42     }*/
    43 
    44     console.log(obj.toString())
    45     /*构造函数其实就是一个函数
    46     函数都是Function实现的。都是它的一个实例*/
    47 
    48    /* Function
    49     Function.prototype
    50     Object
    51     Object.prototype*/
    52 
    53     console.log(Product.__proto__ ===Function.prototype);
    54 
    55     console.log(Array.prototype.__proto__  === Object.prototype );

    二、其他知识

    1、hasOwnproperty

     1 var person= function(){
     2          age=1
     3       };
     4   
     5   person.prototype={
     6          name:'wangshukui'
     7       };
     8 
     9 
    10 var xiaowang = new person();
    11 //实例化之后 重新分配内存 系统会自动屏蔽原型同名 -- 原理 开辟新的空间
    12 
    13   //
    14  alert(xiaowang.hasOwnProperty("name"));//false --表明是原型属性
    15 
    16  alert(xiaowang.hasOwnProperty("age")); //false --类属性
    17  
    18  
    19  //当定义一个实例化属性之后,会自动屏蔽原型属性
    20  xiaowang.name='小李';
    21  alert(xiaowang.hasOwnProperty('name')) //true
    22  
    23  xiaowang.sex='nan';
    24   alert(xiaowang.hasOwnProperty('sex')) //true

    2、isPrototypeOf

    判断iphone是否拥有Product的原型属性

     1 function Product(){
     2         this.name='iphone8';
     3         this.description='手机中的战斗机';
     4         this.price=7777;
     5         this.date=new Date();
     6         this.add = function(){};
     7     }
     8 
     9     Product.prototype={
    10         test:11111,
    11         buy:function(){}
    12     }
    13     var iphone = new Product()
    14     console.log(Product.prototype.isPrototypeOf(iphone));//true

    3、constructor 查看对象的构造函数

     1 //constructor : 查看对象的构造函数
     2 
     3         /*function Aaa(){
     4          }
     5 
     6          var a1 = new Aaa();
     7 
     8          alert( a1.constructor );  //Aaa
     9 
    10          var arr = [];
    11          alert( arr.constructor == Array );  //true*/
    12 
    13 
    14         /*function Aaa(){
    15          }
    16          //Aaa.prototype.constructor = Aaa;   //每一个函数都会有的,都是自动生成的
    17 
    18          //Aaa.prototype.constructor = Array;
    19 
    20          var a1 = new Aaa();
    21          alert( a1.hasOwnProperty == Object.prototype.hasOwnProperty );  //true*/
    22 
    23 
    24         /*function Aaa(){
    25          }
    26 
    27          Aaa.prototype.name = '小明';
    28          Aaa.prototype.age = 20;
    29 
    30          Aaa.prototype = {
    31          constructor : Aaa,
    32          name : '小明',
    33          age : 20
    34          };
    35 
    36          var a1 = new Aaa();
    37          alert( a1.constructor );*/
    38 
    39 
    40         function Aaa(){
    41         }
    42 
    43         Aaa.prototype.name = 10;
    44         Aaa.prototype.constructor = Aaa;
    45 
    46         for( var attr in Aaa.prototype ){
    47             alert(attr);
    48         }

    4、instanceof : 对象与构造函数在原型链上是否有关系

     1 //instanceof : 对象与构造函数在原型链上是否有关系
     2 
     3         function Aaa(){
     4         }
     5 
     6         var a1 = new Aaa();
     7 
     8         //alert( a1 instanceof Object );  //true
     9 
    10 
    11         var arr = [];
    12 
    13         alert( arr instanceof Array );//true

    5、静态属性、原型属性和实例属性

     1  //对象构造函数
     2     function Atest(name){
     3         //私有属性,只能在对象构造函数内部使用
     4         var className = "Atest";
     5         //公有属性,在对象实例化后调用
     6         this.name = name;
     7         //对象方法
     8         this.hello = function(){
     9             alert(this.name);
    10             alert(this.msg());//使用原型方法扩充的方法可以在类内部使用
    11             alert(this.sex);//使用原型方法扩充的属性可以在类内部使用
    12             alert(Atest.age);//静态属性调用时格式为[对象.静态属性]
    13         }
    14     }
    15     //类方法 (实际是静态方法直接调用) 位置:Person类的外部 语法格式:类名称.方法名称 = function([参数...]){ 语句行; }
    16     Atest.Run = function(){
    17         alert("我是类方法 Run");
    18     }
    19 
    20 
    21     //原型方法
    22     Atest.prototype.msg = function(){
    23         alert("我的名字是:"+this.name);//如果原型方法当作静态方法直接调用时,this.name无法被调用
    24     }
    25 
    26     //公有静态属性 在类的外部
    27     Atest.age = 20;//公有静态属性不能使用 【this.属性】,只能使用 【对象.属性】 调用
    28 
    29     //原型属性,当作是类内部的属性使用【this.原型属性】,也可以当成公有静态属性使用【对象.prototype.原型属性】
    30     Atest.prototype.sex = "男";
    31 
    32     Atest.Run(); //类方法也是静态方法,可以直接使用 【对象.静态方法()】
    33     Atest.prototype.msg();//原型方法当成静态方法使用时【对象.prototype.方法()】
    34     alert(Atest.prototype.sex);//原型属性当作静态属性使用时【对象.prototype.方法()】
    35     var a = new Atest("zhangsan");//对象方法和原型方法需要实例化对象后才可以使用
    36     a.hello();//对象方法必须实例化对象
    37     a.msg();//原型方法必须实例化对象
    38     alert(a.age)://错误,公有静态属性只能使用 【对象.属性】调用
    39 
    40     //ps:尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,节省空间,创建对象快.
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/le220/p/8545585.html
Copyright © 2011-2022 走看看