js——prototype、__proto__、constructor
2017-07-08 00:10
656 查看
Object
1. Object是一个函数(typeof Object;//function)。Object构造器创建了一个对象包装器
View Code
6. 性能
在原型链上查找属性比较耗时,试图访问不存在的属性时会遍历整个原型链
遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来
hasOwnProperty是js中唯一一个只涉及对象自身属性而不会遍历原型链的方法
仅判断值是否为undefined不足以检测一个属性是否存在,它可能存在而值恰好为undefined
7. 不好的实践:扩展原生对象的原型
prototype和getPrototypeOf(__proto__)
在函数中有一个属性prototype,它是和new操作符相关的特殊属性。
在内存中创建一个对象,在运行函数前,会把[[prototype]]链接到函数的prototype
等价于:
总的来说:
prototype is for types, while Object.getPrototypeOf() is the same for instance
在prototype中定义的属性可以被new出来的对象共享
我的总结吧~
1. __proto__是每个对象都有的属性,用于访问对象的原型,形成原型链路
2. prototype是函数才有的属性,它在new的时候起作用。
var a = new A();//使得a.__proto__ = A.prototype
3. 为什么要在函数中加一个prototyp属性?(个人理解)
如果不加的话,只能有两种情况:a.__proto__ = A 或者a.__proto__ = A.__proto__
A是一个函数,而a希望是一个对象,这样会使得一个对象有函数的属性,这就不太合理了吧。
4. 与C++类的简单比较
C++:定义一个类A,A中包括了一个构造函数A(),并封封装了需要的属性
js:定义一个function A(){},A有prototype属性,A.prototype中定义需要的属性
所以,这两个的构造函数和封装属性的对象有点反过来的意思吧
5. constructor
下面图的关联关系是从chrome运行结果整理出来的
参考:
1. 《你不知道的javascript》上卷
2. MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
最后,
不企图只看一篇文章然后懂得所有,还是要多翻几篇文章吧。
1. Object是一个函数(typeof Object;//function)。Object构造器创建了一个对象包装器
1 //1. 普通语法 2 //o --> Object.prototype 3 var o = {a:1}; 4 //o --> Array.prototype -->Object.prototype 5 var o = [1, 2]; 6 //f --> Function.prototype -->Object.prototype 7 function f(){ 8 return 2; 9 } 10 11 //2. new 12 function Graph(){ 13 this.vertices = []; 14 this.edges = []; 15 } 16 Graph.prototype = { 17 addVertex: function(v){ 18 this.vertices.push(v); 19 } 20 }; 21 //g-->Graph.prototype--> Object.prototype 22 var g = new Graph(); 23 24 //3. Object.create 25 //a-->Object.prototype 26 var a = {a:1}; 27 //b-->a-->Object.prototype 28 var b = Object.create(a); 29 30 //4. class关键字
View Code
6. 性能
在原型链上查找属性比较耗时,试图访问不存在的属性时会遍历整个原型链
遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来
hasOwnProperty是js中唯一一个只涉及对象自身属性而不会遍历原型链的方法
仅判断值是否为undefined不足以检测一个属性是否存在,它可能存在而值恰好为undefined
var a = { b: undefined }; a.b;//undefined
7. 不好的实践:扩展原生对象的原型
prototype和getPrototypeOf(__proto__)
在函数中有一个属性prototype,它是和new操作符相关的特殊属性。
在内存中创建一个对象,在运行函数前,会把[[prototype]]链接到函数的prototype
var o = new Foo();
等价于:
var o = new Object(); o.[[prototype]] = Foo.prototype; Foo.call(o); //返回o
总的来说:
prototype is for types, while Object.getPrototypeOf() is the same for instance
在prototype中定义的属性可以被new出来的对象共享
我的总结吧~
1. __proto__是每个对象都有的属性,用于访问对象的原型,形成原型链路
2. prototype是函数才有的属性,它在new的时候起作用。
var a = new A();//使得a.__proto__ = A.prototype
3. 为什么要在函数中加一个prototyp属性?(个人理解)
如果不加的话,只能有两种情况:a.__proto__ = A 或者a.__proto__ = A.__proto__
A是一个函数,而a希望是一个对象,这样会使得一个对象有函数的属性,这就不太合理了吧。
4. 与C++类的简单比较
C++ | js |
class A(){ public: A(){} } | function A(){ } A.prototype={ } |
js:定义一个function A(){},A有prototype属性,A.prototype中定义需要的属性
所以,这两个的构造函数和封装属性的对象有点反过来的意思吧
5. constructor
function A(){}//定义一个函数 A.prototype.constructor == A;//true
下面图的关联关系是从chrome运行结果整理出来的
参考:
1. 《你不知道的javascript》上卷
2. MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
最后,
不企图只看一篇文章然后懂得所有,还是要多翻几篇文章吧。
相关文章推荐
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- js中prototype,__proto__,constructor之间的关系
- JS原型与原型链终极详解_proto_、prototype及constructor
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍总结
- !!Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- JS的prototype和__proto__、constructor
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- JS的this、__proto__ 和. prototype 、constructor
- js的prototype、proto和constructor的关系
- prototype、__proto__、constructor、this——不懂别说会JS
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- 详解js中prototype、constructor以及__proto__的关系
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍 ,JS原型
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- 实践一些js中的prototype, __proto__, constructor
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- 深入分析js中的prototype,_proto_,constructor
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍总结