prototype-name - prototype 后,name 属性无法获取

查看:155
本文介绍了prototype-name - prototype 后,name 属性无法获取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        
    </style>
</head>
<body>

<script>
    function Animal(){}
   function Dog (age){
        this.name = 'fuck you' ;
        this.age = age
   }

   var dog = new Dog(12);
   console.log(dog);
   Dog.prototype = Animal;
   var dog2 = new Dog(12);
   console.log(dog2);

</script>
</body>
</html>

1.输出分别为Dog{age:12,name:'fuck you'} Dog{age:12},
为什么添加Dog.prototype = Animal 后结果不一样? 求原理解释?

解决方案

当为一个对象属性赋值是要遵循以下规则:

  1. 当对象的原型链中的原型对象上有对应的属性名,但是其是只读的,那么对象属性的赋值操作无效

  2. 当对象的原型链中的原型对象上有对应的属性名,但是其是可写的,且设置了set方法,那么对象属性的赋值操作无效,转而调用调用原型对象中的属性的set方法

  3. 当对象的原型链中的原型对象上有没有对应的属性名,那么直接在当前对象上添加这个属性(如果没有这个属性)并赋值

还有一个函数对象其有一个name属性,并且这个属性是只读的,
问题呈现出所所述的结果,原因就源于此~~

function Animal(){}
function Dog (age){
    this.name = 'fuck you' ;
    this.age = age
}
var dog = new Dog(12);
console.log(dog);
Dog.prototype = Animal;//将一个函数对象作为Dog的原型对象,其带有一个name只读属性
var dog2 = new Dog(12);
console.log(dog2);

这篇关于prototype-name - prototype 后,name 属性无法获取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆