js原型链

15 篇文章 0 订阅

1. 概念

凡是对象就有原型,原型也是对象,因此凡是定义一个对象,那么就可以找到他的原型,原型还有原型,如此下去,就构成一个对象的序列,成为该结构的原型链。

2. 结构

凡是使用构造函数创建出对象,并且没有利用赋值的方式修改原型,就说该对象保留默认的原型链。

默认原型链的结构:当前对象 -> 构造函数.prototype -> Object.prototype -> null。

{} -> Object.prototype -> null;[ ] -> Array.prototype -> Object.prototype -> null。

在实现继承的时候,有时候会利用替换原型链结构的方式实现原型继承,那么原型链结构就会发生改变。

<script type="text/javascript">
    function MyArr() {}
    MyArr.prototype = [];
    var arr = new MyArr(); // arr -> [] -> Array.prototype -> Object.prototype -> null
</script>

3. 原型式继承

利用修改原型链的结构(增加一个节点、删除一个节点、修改节点中的成员),来使得实例对象可以使用整条链中的所有成员。

<script>
    function Person() {}
    var p = new Person();
    // 代码中{}相当于new Object(),[]相当于new Array(),/./相当于new RegExp('.')
</script>

4. 完整原型链结构

<script>
    var o = {
        appendTo: function(dom){}
    };
    function DivTag() {}
    DivTag.prototype = o;
    var div = new DivTag();
</script>

5. 继承

(1)最简单的继承就是将别的对象的属性强加到我的身上,那么我就有这个成员了。

(2)利用原型也可以实现继承,不需要在我的身上添加任何成员,只要原型有了,我就有了。

(3)综合:将属性、方法等成员利用混入的办法,加到构造函数的原型上,那么构造函数的实例就都具有该方法了。

<script type="text/javascript">
    var Person = function() {}
    Person.prototype.extend = function(o) {
        for(var k in o) {
            this[k] = o[k];
        }
    };
    Person.prototype.extend({
        run: function(){console.log('跑');},
        eat: function(){console.log('吃');}
    });

    var p1 = new Person();
    p1.run();
    p1.eat();

    console.log(new Person()); // Person{}
    console.log(new Person.prototype.constructor()); // 和上面的写法完全相同
</script>

 6. Object.create(对象)-> 新对象

ES5中引入的新方法,实现继承,创建一个原型继承自参数的对象。

<script type="text/javascript">
    var o = {
        sayHello: function(){
            console.log('Hello');
        }
    };
    var o1 = Object.create(o); // 创建新对象o1,该对象的原型即_proto_就是o
    o1.sayHello();

    var myArr =  Object.create([]); // 创建对象,具有数组的方法,并存储数据
    myArr.push(1);

    // 兼容处理,如果浏览器不支持Object.create,自定义函数实现原型继承,返回的对象应该继承自obj
    function inherit(obj) {
        if(Object.create) { // 判断属性是否存在,区别于Object.create()方法,方法不存在即会报错
            return Object.create(obj);
        } else {
            function F() {};
            F.prototype = obj;
            return new F();
        }
    }
    var arr = inherit([]);
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript的原型链是一种通过原型(prototype)来实现对象之间继承关的机制。每个JavaScript对象都有一个原型对象,用于定义该对象的属性和方法。当访问一个对象的属性或方法时,如果该对象本身没有该属性或方法,JavaScript引擎会沿着原型链向上查找,直到找到该属性或方法为止。实际上,原型链是一个链式结构,每个对象的__proto__属性指向其原型对象,形成了一个继承关系。这样,对象可以继承其原型对象的属性和方法,并且原型对象也可以有自己的原型对象,从而形成更深层次的继承关系。因此,原型链在JavaScript中起到了实现对象之间继承关系的重要作用。123 #### 引用[.reference_title] - *1* *3* [JavaScript的原型链](https://blog.csdn.net/m0_72446057/article/details/129155515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [JavaScript原型链(重要)](https://blog.csdn.net/liyuchenii/article/details/125957625)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值