第一种 在原型链上存在名为name 的属性,并且没有被标记为只读,就会被直接添加name的新属性,它是屏蔽属性
const obj = {
name:'xxx',
books:['html','css']
}
function creatObject(o){
function F(){}
F.prototype = o
const fobj = new F()
fobj.name = 'yyy'
return fobj
}
let fobj = creatObject(obj)
console.log(fobj.name,obj.name,)
// yyy ,xxx,
第二种 在原型链上存在名为name 的属性,并且被标记为只读,这条赋值会被忽略(严格模式报错)
const obj = {
name:'xxx',
books:['html','css']
}
Object.defineProperty(obj,'name',{
writable:false
})
function creatObject(o){
function F(){}
F.prototype = o
const fobj = new F()
return fobj
}
let fobj = creatObject(obj)
console.log(fobj.name,obj.name)
// xxx,xxx
第三章 如果原型链存在并且调用的是setter,则不会添加到属性上
const obj = {
name:'xxx',
books:['html','css']
}
function creatObject(o){
function F(){}
F.prototype = o
const fobj = new F()
fobj.books.push('js')
return fobj
}
let fobj = creatObject(obj)
console.log(fobj.books,obj.books)
//['html','css','js'],['html','css','js']