原型的一些操作方法

在这之前可以先学习一下原型的知识:探究JS的原型.

自定义对象的原型设置

自定义了个父子对象,可以看到儿子的原型是指向Object构造函数的:

	let son = {
            name: 'son'
        };
        let father = {
            name: 'father',
            myFn() {
                console.log(`${this.name}调用了father对象内的myFn方法`);
            }
        };

	console.log(son);

在这里插入图片描述
修改儿子的原型,而且儿子也可以使用父亲的myFn方法,顺便获取son的原型对象:

		let son = {
            name: 'son'
        };
        let father = {
            name: 'father',
            myFn() {
                console.log(`${this.name}调用了father对象内的myFn方法`);
            }
        };
        // 通过setPrototypeOf方法将son对象的原型修改为father
        Object.setPrototypeOf(son, father);
        console.log(son);
        son.myFn();
        // Object.getPrototypeOf()获取原型对象。
        console.log(Object.getPrototypeOf(son));

在这里插入图片描述
 
 
 

检测原型链

instanceof

		let son = {
            name: 'son'
        };
        // 检测son的原型链上是否有Object.prototype原型对象
        console.log(son instanceof Object); // true
		function User(name) {
            this.name = name
        }
        let pyy = new User('彭于晏');
        console.log(pyy instanceof User); // true
        console.log(User.prototype instanceof Object); // true

isPrototypeOf()

		let a = {};
        let b = {};
        // 检测a.__proto__是否在b对象的原型链上
        console.log(a.__proto__.isPrototypeOf(b)); // true

        function User() {}
        let user = new User();
        console.log(User.prototype.isPrototypeOf(user)); // true
        console.log(Object.prototype.isPrototypeOf(User.prototype)); // true
        console.log(Object.prototype.isPrototypeOf(user)); // true

in 和 hasOwnProperty 属性检测差异

hasOwnProperty用于检测属性是否在该对象中,而in不仅可以检测是否在该对象中,还可以检测是否在存在于原型链的中

		let a = {
            url: 'CSDN'
        };
        let b = {
            name: '彭于晏'
        };
        console.log('url' in a); // true
        // 给Object添加web属性,也可以检测到a的原型链上存在web属性
        Object.prototype.web = 'csdn,net'
        console.log('web' in a); // true

	    console.log(b.hasOwnProperty('name'));
	    // 虽然Object也在b的原型链上,但是检测不到
        console.log(b.hasOwnProperty("web"));

 
 
 

call()继承

构造函数继承父类属性

		function Father(name, age) {
            this.name = name;
            this.age = age;
        }

        function Son(age, name, score) {
        	// 调用父构造函数,用call方法
        	// 第一个参数是将调用Father的this指向自己,也就是Son函数
        	// 然后就是传参
            Father.call(this, name, age);
            this.score = score;
        };
        let son = new Son(18, 'pyy', 100)
        console.log(son); // Son {name: "pyy", age: 18, score: 100}

构造函数继承父类方法

方法1:利用父类新创建实例对象

		function Father(name, age) {
            this.name = name;
            this.age = age;
        }
        // 父构造函数定义方法
        Father.prototype.work = function() {
            console.log('我要上班');
        }

        function Son(age, name, score) {
            Father.call(this, name, age);
            this.score = score;
        };
        // 子构造函数原型对象指向父构造函数新创建的实例对象。
        Son.prototype = new Father();
        // 要讲Son.prototype的constructor重新指回Son
        Son.prototype.constructor = Son;
        // 子构造函数定义方法
        Son.prototype.exam = function() {
            console.log('我要考试');
        }
        
        let son = new Son(18, 'pyy', 100);
        let father = new Father(40, 'pyy爸爸');
        
        son.work(); // 我要上班
        son.exam(); // 我要考试
        father.work(); // 我要上班
        father.exam(); // father.exam is not a function

在这里插入图片描述
方法二:改变对象原型指向:

		function Pyy() {
            name: '彭于晏'
        };
        Pyy.prototype.showPyyName= function() {
            console.log('彭于晏');
        }

        function Wyz() {
            name: '吴彦祖'
        };
        prototype.showWyzName= function() {
            console.log('吴彦祖');
        };
        // 使Pyy对象能够继承Wyz
        Pyy.prototype.__proto__ = Wyz.prototype;
        let pyy = new Pyy();
        // 继承之后,pyy可以调用Wyz的函数
        pyy.showWyzName();
        // pyy对象的原型链上也有Wyz.prototype的原型对象
		console.log(pyy instanceof Wyz);

在还没继承之前:
在这里插入图片描述
Pyy.prototype.proto 原本是指向Object.prototype的,继承以后,指向了Wyz.prototype,所以原型链也随之发生变化,pyy调动showWyzName()方法,在自己身上找不到,就去Pyy.prototype那找,再找不到就去Wyz.prototype那找,找到了就调用!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值