Object 对象的相关方法
- Object.getPrototypeOf()
- 返回参数对象的原型。
- 这是获取某对象的原型对象的标准方法。
var F = function () {};
var f = new F();
Object.getPrototypeOf(f) === F.prototype // true
- 几种特殊对象的原型
// 空对象的原型是 Object.prototype
Object.getPrototypeOf({}) === Object.prototype // true // Object.prototype 的原型是 null
Object.getPrototypeOf(Object.prototype) === null // true // 函数的原型是 Function.prototype
function f() {}
Object.getPrototypeOf(f) === Function.prototype // true
- Object.setPrototypeOf()
- 重新指定 某对象 的原型对象,返回 某对象。
- 第一参数是 某对象
- 第二参数是 新的原型对象
-
var a = {};
var b = {x: 1};
Object.setPrototypeOf(a, b); Object.getPrototypeOf(a) === b // true
a.x //将对象 a 的原型,设置为对象 b,因此 a 可以共享 b 的属性
-
- 模拟 new 创建实例
var F = function () {
this.foo = 'bar';
}; var f = new F(); // 等同于
var f = Object.setPrototypeOf({}, F.prototype); // 将一个空对象的原型设为构造函数的prototype属性
F.call(f); // 将构造函数内部的this绑定这个空对象,然后执行构造函数,使得定义在this上面的方法和属性(上例是this.foo),都转移到这个空对象上
- Object.create()
- 很多时候,只能拿到一个实例对象,它可能根本不是由构建函数生成的
- Object.create() 接收一个实例对象,以它为原型,再创建并返回一个实例对象。
-
// 原型对象
var A = {
print: function () {
console.log('hello');
}
}; // 实例对象
var B = Object.create(A); Object.getPrototypeOf(B) === A // true
B.print() // hello
B.print === A.print // true以 A 对象为原型,生成了 B 对象。B 继承了 A 的所有属性和方法
-
- 如果想要生成一个不继承任何属性(比如没有 toString() 和 valueOf() 方法)的对象,可以将Object.create() 的参数设为null
- 注意: 参数不能为空,或者不是对象,否则会报错。可以是 null
-
生成的新对象,动态继承了原型
- 意味着在原型上添加或修改任何方法,会立刻反映在新对象之上
- 还可以接受第二个参数。该参数是一个属性描述对象,它所描述的对象属性,会添加到实例对象,作为该对象自身的属性
var obj = Object.create({}, {
p1: {
value: 123,
enumerable: true,
configurable: true,
writable: true,
},
p2: {
value: 'abc',
enumerable: true,
configurable: true,
writable: true,
}
}); // 等同于
var obj = Object.create({});
obj.p1 = 123;
obj.p2 = 'abc';
- Object.create() 方法生成的对象,继承了它的原型对象的构造函数
-
function A() {}
var a = new A();
var b = Object.create(a); b.constructor === A // true
b instanceof A // true上面代码中,b 对象的原型是 a 对象,因此继承了 a 对象的构造函数
-
- Object.prototype.isPrototypeOf()
- 用来判断该对象是否为某对象的原型
var o1 = {};
var o2 = Object.create(o1);
var o3 = Object.create(o2); o2.isPrototypeOf(o3); // true
o1.isPrototypeOf(o3); // true
- 只要实例对象处在参数对象的原型链上,isPrototypeOf() 方法都返回 true
- 由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自 null 的对象除外
- 用来判断该对象是否为某对象的原型
- Object.prototype.__proto__ Object对象的 实例对象的 隐式原型对象
- 根据语言标准,__proto__属性只有浏览器才需要部署,其他环境可以没有这个属性
- 它前后的两根下划线,表明它本质是一个内部属性,不应该对使用者暴露
- 应该尽量少用这个属性,而是用 Object.getPrototypeof() 和 Object.setPrototypeOf(),进行原型对象的读写操作
- __proto__ 属性指向当前对象的原型对象,即构造函数的 prototype 属性
- 获取原型对象的方法的比较
- 获取实例对象 obj 的原型对象,有三种方法
- obj.__proto__ 只有浏览器才需要部署,其他环境可以不部署
- obj.constructor.prototype 在手动改变原型对象时,可能会失效
- 在改变原型对象时,一般要同时设置constructor属性
var P = function () {};
var p = new P(); var C = function () {};
C.prototype = p;
C.prototype.constructor = C; var c = new C();
c.constructor.prototype === p // true
- Object.getPrototypeOf(obj) 最好的方法
- 获取实例对象 obj 的原型对象,有三种方法
- Object.getOwnPropertyNames()
- 返回一个数组,成员是参数对象本身的所有属性的键名(不管是否可以遍历enumerable),但是不包含继承的属性键名
- 只获取那些可以遍历的属性,使用 Object.keys(某对象) 方法
- Object.prototype.hasOwnProperty()
- 用于判断某个属性是否是自身的属性,是返回 true,否则返回 false
- 是 JavaScript 之中唯一一个处理对象属性时,不会遍历原型链的方法
- in 运算符
- 表示一个对象是否具有某个属性。
- 用于检查一个属性是否存在
- 它不区分该属性是对象自身的属性,还是继承的属性
'length' in Date // true
'toString' in Date // true
- for(...in...) 循环
- 获得对象的所有可遍历属性(不管是自身的还是继承的)
-
var o1 = { p1: 123 }; var o2 = Object.create(o1, {
p2: { value: "abc", enumerable: true }
}); for (p in o2) {
console.info(p);
}
// p2 自身的属性
// p1 继承的属性为了获得对象自身的属性,可以采用hasOwnProperty方法判断一下
for ( var name in object ) {
if ( object.hasOwnProperty(name) ) {
console.log(name);
}
}
-
- 获得对象的所有属性(不管是自身的还是继承的,也不管可否遍历),可以使用下面的函数
function inheritedPropertyNames(obj) {
var props = {};
while(obj) {
Object.getOwnPropertyNames(obj).forEach(function(p) {
props[p] = true;
});
obj = Object.getPrototypeOf(obj); // 原型对象的原型对象
}
return Object.getOwnPropertyNames(props);
}inheritedPropertyNames(Date);
// [
// "caller",
// "constructor",
// "toString",
// "UTC",
// ...
// ]
- 获得对象的所有可遍历属性(不管是自身的还是继承的)
- 对象的拷贝
- 如果要拷贝一个对象,需要做到下面两件事情
- 确保拷贝后的对象,与原对象具有 同样的原型
- 确保拷贝后的对象,与原对象具有 同样的实例属性
- 第一种方法
function copyOwnPropertiesFrom(new, old) {
Object.getOwnPropertyNames(old).forEach(function (propKey) {
var desc = Object.getOwnPropertyDescriptor(old, propKey);
Object.defineProperty(new, propKey, desc);
});
return new;
} function copyObject(old) {
var new = Object.create(Object.getPrototypeOf(old));
copyOwnPropertiesFrom(new, old);
return new;
}
- 第二种更简单的写法,是利用 ES2017 才引入标准的Object.getOwnPropertyDescriptors方法
function copyObject(orig) {
return Object.create(
Object.getPrototypeOf(orig),
Object.getOwnPropertyDescriptors(orig)
);
}
- 如果要拷贝一个对象,需要做到下面两件事情
(80)Wangdao.com第十六天_JavaScript Object 对象的相关方法的更多相关文章
-
(81)Wangdao.com第十六天_JavaScript 严格模式
严格模式 除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode).顾名思义,这种模式采用更加严格的 JavaScript 语法 同样的代码,在正常模式和严格模 ...
-
(82)Wangdao.com第十六天_JavaScript 异步操作
异步操作 单线程模型 指的是,JavaScript 只在一个线程上运行 也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运 ...
-
(75)Wangdao.com第十三天_JavaScript 包装对象
包装对象 所谓“包装对象”,就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象 这三个原生对象可以把原始类型的值变成(包装成)对象 var v1 = new ...
-
(59)Wangdao.com第十天_JavaScript 对象在 栈和堆
对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值 // 存 对象["属性名"] // 取 obj["1 ...
-
(61)Wangdao.com第十天_JavaScript 立即执行函数
1. 立即执行函数 创建完了就执行,只执行完就不再执行了. ( function(){} )(); 例 ( function(a,b){ alert("Hello ,我是一个匿名函数!&qu ...
-
(64)Wangdao.com第十天_JavaScript 对象的 toString() 方法改变输出
JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象); // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我 ...
-
(62)Wangdao.com第十天_JavaScript 变量的作用域
在 js 中有两种作用域:全局作用域,局部作用域. 全局作用域 直接写在 <script> 标签中的变量和方法. 在网页打开时创建,在网页关闭时销毁. 全局作用域有一个全局对象 windo ...
-
(60)Wangdao.com第十天_JavaScript 函数_作用域_闭包_IIFE_回调函数_eval
函数 实现特定功能的 n 条语句封装体. 1. 创建一个函数对象 var myFunc = new Function(); // typeof myFunc 将会打印 function ...
-
(65)Wangdao.com第十天_JavaScript 垃圾回收机制 GC
垃圾积累过多,致使程序运行缓慢,什么是垃圾? 当堆中某个内容,再也没有指针指向它,我们将再也用不了它,此时就是一个垃圾. 出现这种情况是因为 obj = null; 此时,js 中的垃圾回收机制会自动 ...
随机推荐
-
张恭庆编《泛函分析讲义》第二章第2节 $Riesz$ 定理及其应用习题解答
在本节中, $\scrH$ 均指 $Hilbert$ 空间. 1.在极大闭子空间的交的最佳逼近元 设 $f_1,f_2,\cdots,f_n$ 是 $\scrH$ 上的一组线性有界泛函, $$\bex ...
-
引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案
引起标题上所导致的错误是因为你的第三方库没有放入到Compile Sources里面去. 需要到你项目的Targets>>Build Phases>>Compile Sourc ...
-
salesforce apex class call exteral webservice
在项目中需要调用外面的Webservice, 从Salesforce往外写入其他系统.目前一般有两种方法. 1. 根据对方提供的wsdl文件生成apex class,直接实例化后调用其方法(测试成功 ...
-
免费试用MongoDB云数据库 (MongoDB Atlas)教程
众所周知,MongoDB包括社区版和企业版,但不止如此,MongoDB公司还有MongoDB Atlas:Database as a Service. MongoDB Atlas delivers t ...
- hive字符函数
-
ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)
题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...
-
利用JS自动打开页面上链接的实现代码
在这里做一下简单记录,防止自己忘记. 下面是实现自动点击打开链接的主要函数,功能不再细说,防止太多人滥用,有心的人一看就会明白,改把改把就是一个邪恶的程序: function randopen() { ...
-
(网页)logback的使用和logback.xml详解(转)
转自博客园:行走在云端的愚公: 一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: ...
-
java基础面试题常出现(一)
1.”==“和equals方法的区别? 1. ==操作符,对于基本数据类型变量,比较的是两个值是否相等,而对于引用类型,比较的是引用的内存的首地址,即引用同一个对象.1 Obeject的equal ...
-
mysql insert if not exists防止插入重复记录的方法(转)
MySQL 当记录不存在时插入(insert if not exists) 在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当 ...