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 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
Dec 13 Javascript
javascript offsetX与layerX区别
Mar 12 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
JavaScript修改css样式style动态改变元素样式
Dec 16 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
Aug 21 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
May 05 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
vue-amap根据地址回显地图并mark的操作
Nov 03 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的autoload机制的实现解析
2012/09/15 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
js loading加载效果实现代码
2009/11/24 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
js制作提示框插件
2020/12/24 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
分析在Python中何种情况下需要使用断言
2015/04/01 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
python简单实现基数排序算法
2015/05/16 Python
python读取中文txt文本的方法
2018/04/12 Python
python 正确保留多位小数的实例
2018/07/16 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Python3如何判断三角形的类型
2020/04/12 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
新闻发布会策划方案
2014/06/12 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
法定授权委托证明书
2014/09/27 职场文书
Linux中各个目录的作用与内容
2022/06/28 Servers
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis