您的位置:首页 > Web前端 > JavaScript

js——prototype、__proto__、constructor

2017-07-08 00:10 656 查看
Object

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={
}


C++:定义一个类A,A中包括了一个构造函数A(),并封封装了需要的属性

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

最后,

不企图只看一篇文章然后懂得所有,还是要多翻几篇文章吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: