重点--原型2

2019-06-24  本文已影响0人  潘肚饿兵哥哥
function MyClass(){
                    
    }       
    
    //向MyClass原型中添加一个name属性
    MyClass.prototype.name = "我是原型中的名字";
    
    var mc = new MyClass();
    console.log(mc.name);//mc里没有name属性,就会去原型里找,返回值  我是原型中的名字
        

\color{rgba(254, 67, 101, .8)}{用in检查一个对象中是否有某个属性 ,如果对象中没有,原型中有,也会返回true}

function MyClass(){
                    
    }       
    
    //向MyClass原型中添加一个name属性
    MyClass.prototype.name = "我是原型中的名字";
    
    var mc = new MyClass();
    console.log(mc.name);//mc里没有name属性,就会去原型里找,返回值  我是原型中的名字
    
    console.log("name" in mc);//用in检查一个对象中是否有某个属性,只检查自身,不检查原型
    console.log(mc.hasOwnProperty("name"));
image.png
function MyClass(){
                    
    }       
    
    //向MyClass原型中添加一个name属性
    MyClass.prototype.name = "我是原型中的名字";
    
    var mc = new MyClass();
    mc.age = 18;
    
    console.log(mc.hasOwnProperty("age"));
    console.log(mc.hasOwnProperty("hasOwnProperty"));
image.png

\color{rgba(254, 67, 101, .8)}{hasOwnProperty();这个方法只检查他自身}
\color{rgba(254, 67, 101, .8)}{如上图,mc本身没有添加这个方法:}
\color{rgba(254, 67, 101, .8)}{mc.hasOwnProperty("hasOwnProperty")返回 flase,}

\color{rgba(254, 67, 101, .8)}{实际上,他在原型的原型里:}

    function MyClass(){
                    
    }       
    
    //向MyClass原型中添加一个name属性
    MyClass.prototype.name = "我是原型中的名字";
    
    var mc = new MyClass();
    mc.age = 18;
    
    console.log(mc.hasOwnProperty("age"));//用hasOwnProperty这个方法检查mc里有age属性
    
    console.log(mc.hasOwnProperty("hasOwnProperty"));//但是mc里并没有hasOwnProperty这个方法
    
    console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));//它的原型里也没有这个方法
    
    //之所以找不到hasOwnProperty这个方法,是因为只要是对象就有原型,所以原型对象也有原型
    
    //所以去他的原型的原型里找:  原型的原型里有这个属性
    console.log(mc.__proto__.__proto__)
    
    //所以,hasOwnProperty在原型的原型里,返回true
    console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"))
image.png

\color{rgba(254, 67, 101, .8)}{这就是原型链}


    <!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            
            /*
             * 创建一个构造函数
             */
            function MyClass(){
                
            }
            
            //向MyClass的原型中添加一个name属性
            MyClass.prototype.name = "我是原型中的名字";
            
            var mc = new MyClass();
            mc.age = 18;
            
            //console.log(mc.name);
            
            //使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
            //console.log("name" in mc);
            
            //可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性
            //使用该方法只有当对象自身中含有属性时,才会返回true
            //console.log(mc.hasOwnProperty("age"));
            
            //console.log(mc.hasOwnProperty("hasOwnProperty"));
            
            /*
             * 原型对象也是对象,所以它也有原型,
             *  当我们使用一个对象的属性或方法时,会现在自身中寻找,
             *      自身中如果有,则直接使用,
             *      如果没有则去原型对象中寻找,如果原型对象中有,则使用,
             *      如果没有则去原型的原型中寻找,直到找到Object对象的原型,
             *      Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined
             */
            
            //console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));
            
            //console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
            
            //console.log(mc.__proto__.__proto__.__proto__);
            
            //console.log(mc.hello);
            
            //console.log(mc.__proto__.__proto__.__proto__)mc的原型的原型就没有原型了,所以,这里找原型的原型的原型返回值为null,证明他只有原型的原型
            
        </script>
    </head>
    <body>
    </body>
</html>

上一篇 下一篇

猜你喜欢

热点阅读