第198天:js---内置对象的原型链和其他知识

Posted 半指温柔乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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:尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,节省空间,创建对象快.

 

以上是关于第198天:js---内置对象的原型链和其他知识的主要内容,如果未能解决你的问题,请参考以下文章

关于JS的原型链和作用域链

js原型链和继承的理解

JavaScript高级原型和继承相关:原型对象函数原型原型链和继承继承的优化对象判断相关方法

JavaScript高级原型和继承相关:原型对象函数原型原型链和继承继承的优化对象判断相关方法

原型 原型链和对象是怎么实现继承的

js 原型链和继承(转)