JS中Object对象的原型概念基础


Posted in Javascript onJanuary 29, 2018

对象概念

在 javascript 中, 一切引用类型均为对象。 如 function Foo () {} 中,Foo本身就是一个对象的引用。

创建对象方式 字面量方式 new 构造函数函数声明 Object.create

字面量对象

javascript语言级别快速创建对象的实例

var obj = {foo: 'foo', bar: 'bar'}; // Object对象字面量
var obj2 = [obj, 'foo', 'bar']; // Array数组字面量
var obj3 = /^[a-zA-Z0-9]$/; // RegExp正则字面量
var obj4 = function(){}; // Function函数字面量

new 构造函数

通过内置对象的构造函数,或者自定义的函数。 使用 new 操作符,创建一个对象,并且执行构造函数方法。

var obj = new Object();
var obj2 = new Array(1000);
var obj3 = new RegExp('^[a-zA-Z0-9]$');
var obj4 = new Function('a', 'b', 'return a + b;');

函数声明

函数声明创造的对象. 函数属于特殊的对象.

function Foo() {}
Foo instanceof Object;
Foo instanceof Function;

Object.create

传入一个对象作为返回对象的原型,创建一个新对象, 并将新对象的原型指向传入的对象中。

var foo = {
 'foo': 'foo',
 'bar': 'bar'
};
var o = Object.create(foo); // o.__proto__ = foo
console.log(o.foo); // o.__proto__.foo

使用Object.create(null) 可以返回一个字典型对象.

var o = Object.create(null);
o instanceof Object; // return false;
o.toString(); // Uncaught TypeError

对象原型

每一个对象都有一个内置的 __proto__ 属性指向构造它的函数prototype属性. 而构造函数的

prototype.constructor 则指向构造函数本生。一个对象的属性的寻找过程由以下几个部分组成:

寻找对象属性的数据描述符(writable, value)或存取描述符(getter, setter),如果查询到了,则返回 对应的值。如果查询不到,则进入第2步骤。寻找对象属性的值是否有被显示定义 (可以通过 Object.getOwnPropertyNames)检测,如果对象属性定义了,则返回定义的值。 如果没有,则进入第3步骤。寻找对象的隐藏原型__proto__对象的属性,规则同1,2步骤。如果还未找到,则重复第3步骤, 直到__proto__ 为null 为止。

具体案例如下图所示:

JS中Object对象的原型概念基础

检测对象原型

测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性

instanceof Object.prototype.isPrototypeOf

instanceof

运算符,语言级别的检测对象的原型链是否包含构造函数的原型

function Foo () {}
Foo instanceof Function; // return true
Foo instanceof Object; // return true

模拟instanceof查找对象的原型链的构造函数是否包含传入的构造函数, __proto__ 在一些特定的浏览器有暴露给用户

function Bar () {}
function isInstanceof (obj, Constructor) {
 if (obj === null) {
 return false;
 }
 // 忽略 string, number, boolean, null, undefined 类型干扰
 if (!~['object', 'function'].indexOf(typeof obj)) {
 return false;
 }

 var prototype = obj.__proto__;
 while(prototype) {
 if (prototype.constructor === Constructor) {
  return true;
 }
 prototype = prototype.__proto__;
 }
 return false;
}
isInstanceof(Bar, Function);
isInstanceof(Bar, Object);

isPrototypeOf

构造函数的原型对象自带的函数属性, 用于检测目标对象的原型链中是否存在构造函数的原型对象。

function Baz () {}
var baz = new Baz();
Baz.prototype.isPrototypeOf(baz);
Function.prototype.isPrototypeOf(baz);
Object.prototype.isPrototypeOf(baz);

获取对象原型 Object.getPrototypeOf __proto__

var o = {};
var prototype = Object.getPrototypeOf(o);
console.log(prototype === Object.prototype); // return true
// 部分浏览器有效
var o2 = {};
console.log(o2.__proto__ === Object.prototype); // return true

设置对象原型 Object.create Object.setPrototypeOf

Object.create

返回一个对象,并设置它的原型

function Foo () {}
 function Bar () {}
 Foo.prototype.foo = 'foo';
 Bar.prototype = Object.create(Foo.prototype); 
 Bar.prototype.constructor = Bar; // 修正原型链的constructor
 var o = new Bar();
 console.log(o.foo); // return foo;
 console.log(o instanceof Bar); // return true

Object.setPrototypeOf

直接设置对象的隐式原型__proto__

function Foo () {}
 Foo.prototype.name = 'foo';
 var o = Object.create(null);
 Object.setPrototypeOf(o, Foo.prototype);
 console.log(o.name); // return foo

小结

对象具有许多考验开发者的一些知识点。能够完全理解并整理出来是不容易的。后续我会针对对象的继承做个详细的介绍。感谢你对三水点靠木的支持。

Javascript 相关文章推荐
Javascript中的常见排序算法
Mar 27 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
jQuery中filter()方法用法实例
Jan 06 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
基于JS代码实现导航条弹出式悬浮菜单
Jun 17 Javascript
JS简单获取并修改input文本框内容的方法示例
Apr 08 Javascript
微信小程序form表单组件示例代码
Jul 15 Javascript
vue.js中ref和$refs的使用及示例讲解
Aug 14 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
Vue组件模板及组件互相引用代码实例
Mar 11 Javascript
JSONP解决JS跨域问题的实现
May 25 Javascript
Vue实现菜单切换功能
Nov 08 Javascript
vue.js实现只弹一次弹框
Jan 29 #Javascript
javascript trie前缀树的示例
Jan 29 #Javascript
Vue官网todoMVC示例代码
Jan 29 #Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
Jan 29 #jQuery
Angular2 父子组件通信方式的示例
Jan 29 #Javascript
jQuery代码优化方法总结
Jan 29 #jQuery
javascript代码优化的8点总结
Jan 29 #Javascript
You might like
php学习之 循环结构实现代码
2011/06/09 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP反射实际应用示例
2019/04/03 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
简单的js计算器实现
2016/10/26 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
python如何提升爬虫效率
2020/09/27 Python
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
MySQL 5.7常见数据类型
2021/07/15 MySQL