关于__proto__和prototype
prototype是函数的一个属性(每个函数都有一个prototype属性),
这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。
__proto__是一个对象拥有的内置属性,
(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),
是JS内部使用寻找原型链的属性。
chrome和FF都可以访问到对象的__proto__属性,IE不可以。
eg:
var Person = function () {
};
var p = new Person()
var p ={
}
p.__proto__ = Person.prototype
Person.call(p);
var Person = function(){
};
var p = new Person();
alert(p.__proto__ === Person.prototype)
var Person = function() {
Person.prototype.say
};
1.Object.is():
用于比较两个值是否严格相等,与===运算符的行为基本一致
ES5比较两个值是否相等,只有两个运算符:(==)和严格相等运算符(===)
== 代表相同, ===代表严格相同
当进行双等号比较时候: 先检查两个操作数数据类型,
如果相同, 则进行===比较,
如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较,
而===比较时, 如果类型不同,直接就是false.
他们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身、以及+0等于-0
c
onsole.log(null==undefined)
console.log(null===undefined)
console.log(Object.is('foo','foo'))
console.log(Object.is(+0 === -0))
console.log(NaN === NaN)
console.log(Object.is(NaN,NaN))
2.Object.assign()
Object.assign()方法用于将源对象(source)的所有可枚举对象属性赋值到目标对象上(target)
var obj1 = {
a: {
b: 1}};
var obj2 = Object.assign({
}, obj1);
console.log(obj2.a.b)
const test1 = {
a:1,
b:2
}
const test2 = {
b:3,
c:4
}
const test3 = {
c:5,
d:6
}
test3.__proto__.e = 99;
const test4 = Object.assign(test1,test2,test3)
console.log(test1)
console.log(test2)
console.log(test4)
3.构造函数
此例题可说明,Object.assign()是浅拷贝
function Test3 (){
this.c = 5;
this.d = 6;
}
const test1 = {
a:1,
b:2
}
const test2 = {
b:3,
c:4
}
const test3 = new Test3()
test3.__proto__.e = 99;
const obj = new Object()
const test4 = Object.assign(test1,test2,test3);
console.log(test4)
console.log(test3)
4.Object.create()
Object.create()是ECMAScript5中新增的方法,用于创建一个新对象,
被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性
语法:Object.create(proto[propertiesObject])
proto:对象,要继承的原型
propertiesObject:对象,可选参数,为新创建的对象指定属性对象。
该属性对象可以包含以下值
configurable 表示新创建的对象是否是可配置的,即对象的属性是否可以被删除或修改,默认false
enumerable 对象属性是否可枚举的,即是否可以枚举,默认false
writable 对象是否可写,是否或以为对象添加新属性,默认false
get 对象getter函数,默认undefined (获取对象属性值)
set 对象setter函数,默认undefined (设置对象属性值)
注意,使用Object.create()方法创建对象时,如果不是继承一个原有的对象,
而是创建一个全新的对象,就要把proto设置为null。
eg:
基类
function Site() {
this.name = 'Site';
this.domain = 'domain'
}
Site.prototype.create = function (name,domain) {
this.name = name;
this.domain = domain;
}
function Itbilu() {
Site.call(this)
}
Itbilu.prototype = Object.create(Site.prototype);
var itbilu = new Itbilu()
console.log(itbilu instanceof Site)
console.log(itbilu instanceof Itbilu)
itbilu.create('IT笔录','it笔录网站')
console.log(itbilu.name);
console.log(itbilu.domain);
function Person(){
};
var p = new Person()
console.log(p instanceof Person)
3.Object.definedProperty(obj,prop,descriptor)
关于对象:对象是由多个名/值对组成的无序的集合。
对象中每个属性对应任意类型的值。
定义对象可以使用构造函数或字面量的形式:
var obj = new Object; // obj = {}
obj.name = "张三"; // 添加描述
obj.say = function() {}; // 添加行为
除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或者修改原有的属性
语法:
Object.defineProperty(obj,prop,descriptor)
参数说明
obj:必需,目标对象
prop:必需,需要定义或修改的属性的名字
description:必需,目标属性所拥有的特性
返回值:
传入函数的对象:即第一个参数obj;
针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;
是否可以被for...in或Object.keys()遍历
给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述
eg:
当修改或定义对象的某个属性的时候,给这个属性添加一些特性:
var obj = {
test:"hello"
}
Object.defineProperty(Obj,"test",{
configurable: true || false,
enumerable:true || false,
value:任意类型的值,
writable:true || false,
});
// 2.对象新添加的属性的特性的描述
Object.defineProperty(obj,"newKey", {
configurable:true || false,
enumerable:true || false,
value:任意类型的值,
writable: true || false,
})
举例:
1.writable
var obj = {
}
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false
})
obj.newKey = "好好学习"
console.log(obj.newKey)
第二种情况:writable设置为true,可以重写
var obj = {
}
Object.defineProperty(obj,"newKey",{
value:"to be more",
writable:true,
});
obj.newKey="to be best girl";
console.log(obj.newKey)
要加油!!!!!
2.enumerable
此属性是否可以被枚举(使用for...in或者Object.keys()).
设置为true可以被枚举,设置为false,不能被枚举,默认为false.
第一种情况:enumerable设置为false,不能被枚举
var obj = {
}
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false
})
for (var attr in obj){
console.log(attr);
}
第二种情况:enumerable设置为true,可以被枚举
var obj = {
}
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:true
});
for(var attr in obj) {
console.log(attr)
}
3.configurable
是否可以删除目标属性或是否可以再次修改属性的特性(writable,configurable,enumerable).
设置为true可以被删除或者可以重新设置特性;设置为false,不能被删除或者不能重新设置属性,默认为false.
这个属性起到两个作用:
目标属性是否可以使用delete删除
目标属性是否可以再次设置特性
测试目标属性是否能够被删除
第一种情况:configurable设置为false,不能被删除。
var obj = {
}
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:true,
})
delete obj.newKey;
console.log(obj.newKey)
第二种情况:configurable设置为true,可以被删除(修改上个案例的值,看演示结果)
注意:一旦使用Object.defineProperty给对象添加属性,
那么如果不设置属性的特性,
那么configurable、enumerable、writable这些值都为默认的false