欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js 原型链,原型继承

程序员文章站 2024-03-13 11:09:21
...

1. 原型链

注意:这是两个下划线,后面是五个字符的 “proto” ,后面再跟两个下划线
函数(Function)才有prototype属性,prototype是一个对象;
对象(除Object)拥有__proto__,指向父类的原型(指向创建该对象的函数的prototype),proto是对象和对象之间连接的桥梁,即是原型链 ;
原型链的顶层就是Object.prototype,而这个对象的是没有原型对象的;
实例的构造函数属性(constructor)指向指向构造函数:

<script type="text/javascript">

        function Person(){  
        };
        var person1=new Person();
        console.log(Person.prototype.__proto__===Object.prototype); //true
        console.log(Person.prototype.constructor===Person); //true
        console.log(person1.constructor===Person); //true
        console.log(person1.__proto__===Person.prototype); //true
        Object.prototype.__proto__==null;
        Array.__proto__ === Function.prototype;
        Array.__proto__.__proto__ === Object.prototype;

    </script>

js 原型链,原型继承
js 原型链,原型继承

△警告: 通过现代浏览器的操作属性的便利性,可以改变一个对象的 [[Prototype]] 属性, 这种行为在每一个JavaScript引擎和浏览器中都是一个非常慢且影响性能的操作,使用这种方式来改变和继承属性是对性能影响非常严重的,并且性能消耗的时间也不是简单的花费在 obj.__proto__ = ... 语句上, 它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象中修改它的 [[Prototype]].。相反, 创建一个新的且可以继承 [[Prototype]] 的对象,推荐使用

Object.create()

△警告:Object.prototype.__proto__ 已被大多数浏览器厂商所支持的今天,其存在和确切行为仅在ECMAScript 2015规范中被标准化为传统功能,以确保Web浏览器的兼容性。为了更好的支持,建议只使用 Object.getPrototypeOf()

2. instanceOf()

instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型。

3. js继承方式

原型继承:是将上级函数实例赋值给下级函数的原型

4. hasOwnProperty(),isPrototypeOf()

function iterate(obj) {
    var arr=[];
     for(x in obj)
     {
         if(obj.hasOwnProperty(x))//查找非原型链上继承来的属性,查找当前对象本身的属性,不能识别原型链上继承来的属性
         {
             arr.push(x+": "+obj[x]);
         }
     }
    return arr;
}
//输出样例:["foo: bar", "baz: bim"]

isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false。
格式如object1.isPrototypeOf(object2);
object1是一个对象的实例;
object2是另一个将要检查其原型链的对象。

5.

定义一个函数,它的prototype默认是一个空对象,即{}

var test = function () {return 'haha';};
console.log(test.prototype); // {}
相关标签: prototype __proto__