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 相关文章推荐
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
javascript替换已有元素replaceChild()使用介绍
Apr 03 Javascript
jQuery实现的动态伸缩导航菜单实例
May 07 Javascript
EasyUI中在表单提交之前进行验证
Jul 19 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
vuejs简单验证码功能完整示例
Jan 08 Javascript
Vue实现导航栏点击当前标签变色功能
Aug 19 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
JavaScript创建表格的方法
Apr 13 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
详解爬虫被封的问题
2019/04/23 Python
Django框架 信号调度原理解析
2019/09/04 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
基于Python正确读取资源文件
2020/09/14 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
感恩节活动方案
2014/01/27 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
公路绿化方案
2014/05/12 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
2014年实习期工作总结
2014/11/27 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
Python使用DFA算法过滤内容敏感词
2022/04/22 Python