prototype与__proto__区别详细介绍


Posted in Javascript onJanuary 09, 2017

prototype与__proto__区别

Each constructor is a function that has a property named “prototype” that is used to implement prototype-based inheritance and shared properties. Every object created by a constructor has an implicit reference (called the object's prototype) to the value of its constructor's “prototype” property.
When a constructor creates an object, that object implicitly references the constructor's prototype property for the purpose of resolving property references. The constructor's prototype property can be referenced by the program expression constructor.prototype, and properties added to an object's prototype are shared, through inheritance, by all objects sharing the prototype. Alternatively, a new object may be created with an explicitly specified prototype by using the Object.create built-in function. ?ECMAScript® 2015 Language Specification

__proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!!

使用Object.getPrototypeOf()代替__proto__!!!

一、prototype

几乎所有的函数(除了一些内建函数)都有一个名为prototype(原型)的属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。prototype是通过调用构造函数而创建的那个对象实例的原型对象。hasOwnProperty()判断指定属性是否为自有属性;in操作符对原型属性和自有属性都返回true。

示例:自有属性&原型属性

var obj = {a: 1};
obj.hasOwnProperty("a"); // true
obj.hasOwnProperty("toString"); // false
"a" in obj; // true
"toString" in obj; // true

示例:鉴别原型属性

function hasPrototypeProperty(obj, name){
  return name in obj && !obj.hasOwnProperty(name);
}

二、__proto__

对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。

function Foo(){}
var Boo = {name: "Boo"};
Foo.prototype = Boo;
var f = new Foo();

console.log(f.__proto__ === Foo.prototype); // true
console.log(f.__proto__ === Boo);  // true
Object.getPrototypeOf(f) === f.__proto__;  // true

三、Object.getPrototypeOf()

一个对象实例通过内部属性[[Prototype]]跟踪其原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。可以调用对象的Object.getPrototypeOf()方法读取[[Prototype]]属性的值,也可以使用isPrototypeOf()方法检查某个对象是否是另一个对象的原型对象。大部分JavaScript引擎在所有对象上都支持一个名为__proto__的属性,该属性可以直接读写[[Prototype]]属性。

示例:原型对象

function Person(name) {
  this.name = name;
}
Person.prototype = {
  constructor: Person,
  sayName: function(){
    console.log("my name is " + this.name);
  }
}
var p1 = new Person("ligang");
var p2 = new Person("Camile");
p1.sayName();  // my name is ligang
p2.sayName();  // my name is Camile

prototype与__proto__区别详细介绍

While Object.prototype.proto is supported today in most browsers, its existence and exact behavior has only been standardized in the ECMAScript 6 specification as a legacy feature to ensure compatibility for web browsers. For better support, it is recommended that only Object.getPrototypeOf() be used instead. ?MDN

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS event使用方法详解
Apr 28 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
Feb 10 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 Javascript
Array.filter中如何正确使用Async
Nov 04 Javascript
jQuery实现二维码扫描功能
Jan 09 #Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 #Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
Jan 09 #Javascript
基于jQuery实现滚动刷新效果
Jan 09 #Javascript
用jQuery实现优酷首页轮播图
Jan 09 #Javascript
AngularJS实现表单验证功能
Jan 09 #Javascript
AngularJS表单基本操作
Jan 09 #Javascript
You might like
由php的call_user_func传reference引发的思考
2010/07/23 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
百度地图自定义控件分享
2015/03/04 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
vue实现登录功能
2020/12/31 Vue.js
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Django添加feeds功能的示例
2018/08/07 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
教师找工作推荐信
2013/11/23 职场文书
开业庆典邀请函
2014/01/08 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
尼克胡哲观后感
2015/06/08 职场文书
班主任工作总结范文
2015/08/13 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery