前端面试题 改变原型链上的值

50 阅读1分钟

第一种 在原型链上存在名为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']