js——prototype、__proto__、constructor
Object
1. Object是一个函数(typeof Object;//function)。Object构造器创建了一个对象包装器
//Object{}
var o = new Object(null);
//Object{}
var o = new Object(defined);
//Number
var o = new Object(1);
//Boolean
var o = new Object(true);
2. Object.prototype属性是Object的原型对象
3. js中几乎所有objects都是Object的实例,一个object会继承Object.prototype的所有属性,这些属性也可能被屏蔽。
4. JavaScript没有子类对象,原型用于为某些表现为对象的函数创建一个“基类”对象
Constructor
Foo函数在声明时,Foo.prototype有一个默认属性.constructor,这个属性默认指向Foo
它不表示“由。。。构造”!
var a = new Foo();
a.constructor === Foo;//true
//a.__proto__ == Foo.prototype
//a.constructor被委托给Foo.prototype
//Foo.prototype.constructor默认为Foo
对象的constructor默认指向一个函数,这个函数可以通过对象的.prototype引用
__proto__
1. __proto__属性是个可访问的属性,它可以用来访问[[Prototype]]
2. __proto__的使用不被鼓励。它一开始并没有被包含在EcmaScript中,但是浏览器却一定要实现它。为了保证兼容性,未来将会在ECMAScript2015中规范并支持。
更推荐使用Object.getPrototypeOf/setPrototypeOf
3.__proto__ 的实现,get和set:
Object.defineProperty(Object.prototype, "__proto__", {
get: function(){
return Object.getPrototyperOf(this);
},
set: function(o){
Object.setPrototypeOf(this, o);
return o;
}
});
prototype
1. 函数中有prototype对象,非函数没有prototype对象
2. 函数的prototype在new的时候起作用。让new func()出来的对象的__proto__指向func.prototype
3. 那没有自己设置prototype的函数的prototype是什么值?
function a(){}
//a.__proto__ -->function(){[native code]}
//a.constructor -->function Function{[native code]}
//a.prototype.__proto__ -->Object.prototype
//a.prototype.constructor --> a
继承和原型链
1. 继承:js只有一个构造器objects。每个object有一个私有属性[[Prototype]],它指向另一个对象,称为它的prototype对象。
2. prototype对象也有它的prototype对象,最后达到null。null没有prototype对象,因此它是原型链的最后节点
3. 原型链:当想要访问一个对象属性时,它从当前对象开始一直沿着它的原型向上访问,直到null
4. 基于原型链的继承
- 继承属性
myObject.foo = "bar";
myObject有foo属性,修改foo的值(屏蔽原型链上的)
myObject无foo属性,沿myObject原型链向上查找,且原型链上有foo属性
- 可写:在myObject添加foo属性(屏蔽原型链上的)
- 不可写:语句被忽略/报错(严格模式)
- 是setter:不改变
- 继承方法
与继承属性类似
5. 创建对象的不同方法及原型链
//1. 普通语法
//o --> Object.prototype
var o = {a:1};
//o --> Array.prototype -->Object.prototype
var o = [1, 2];
//f --> Function.prototype -->Object.prototype
function f(){
return 2;
} //2. new
function Graph(){
this.vertices = [];
this.edges = [];
}
Graph.prototype = {
addVertex: function(v){
this.vertices.push(v);
}
};
//g-->Graph.prototype--> Object.prototype
var g = new Graph(); //3. Object.create
//a-->Object.prototype
var a = {a:1};
//b-->a-->Object.prototype
var b = Object.create(a); //4. class关键字
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(){
|
function A(){
|
- 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
最后,
不企图只看一篇文章然后懂得所有,还是要多翻几篇文章吧。
js——prototype、__proto__、constructor的更多相关文章
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...
- 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- js高级——构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器
一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别 ...
- JS中的prototype、__proto__与constructor属性
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- JS中的prototype、__proto__与constructor
1.前言 作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关 ...
- JS中的prototype、__proto__与constructor(图解)
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty
//理解各种方法和属性typeof.instanceof.constructor.prototype.__proto__.isPrototypeOf.hasOwnProperty. //1.typeo ...
- 原型链继承中的prototype、__proto__和constructor的关系
前不久写了有关原型链中prototype.__proto__和constructor的关系的理解,这篇文章说说在原型链继承中的prototype.__proto__和constructor的关系. 通 ...
- JS的prototype和__proto__、constructor
看了JS的prototype和__proto__这篇文章,才感觉很清晰了,对于原型这块,以前经常把这些属性弄不清楚, 明白了之后保存下整理下: prototype: 是函数的一个属性(每个函数都有一个 ...
- 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍
一 Prototype.__proto__与Object.Function关系介绍 Function.Object:Js自带的函数对象. prototype,每一个 ...
随机推荐
- Javaweb学习笔记——(九)——————Servlet的进入,及ServletConfig、GenericServlet、HttpServlet、ServletContext、获取类路径资源
Servlet1.什么是Servlet? *Servlet是Javaweb三大组件之一(Servlet,Filter,Listener) *Servlet是用来处理客户端请求的动态资源 *Servle ...
- 【全文转载】Gradle、Maven项目相互转换
Doublemine 首页 标签 归档 关于 搜索 Gradle.Maven项目相互转换 发表于 2017-08-21 | 更新于: 2018-03-18 | 阅读次数: 920 字数统计 ...
- mvc 导出execl
mvc导出execl 必须是get方法才可以 也不能使用ajax function ComplaintsExport() { var serial = $("form").ser ...
- rabbitMQ学习2-Python与rabbitmq
python客户端 # rabbitmq官方推荐的python客户端pika模块 pip3 install pika 应用场景1:单发送单接收 1.生产-消费者模型 P 是生产者 C 是消费者 中间h ...
- I/O 流
输入流的几个常用方法: 1,复制一个文件; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- c++ virtual 记录
虚继承: http://zh.wikipedia.org/wiki/%E8%99%9A%E7%BB%A7%E6%89%BF 解决了菱形继承问题 cB cC 继承cA cD继承cB,cC c ...
- iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频
iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸 50mm*60mm 高度 核心板连接器组合高度1.5mm PCB层数 6层PCB沉金设计 4418 CPU ARM ...
- jQuery.extend 函数使用
JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.Jquery的扩展方 ...
- LAS(Listener、Attender、Speller)端到端构架
基于注意力(Attention)机制的端到端系统,又被称为LAS端到端构架. [6] W. Chan, N. Jaitly, Q. Le, O. Vinyals. Listen, Attend and ...
- Hive思维导图之Hive优化