JS面向对象,__proto__和prototype详解

一、类,对象和原型

类是具体事物的抽象,而对象是类的实例。举个例子,学生类可以有nama属性,grade属性,study方法等等,而对于学生类的实例就具体到某一个学生上去了,如name:小红 grade:高二 等等
理解了类和对象我们再来说说原型,在JS中不区分类和实例的概念,而是通过原型来实现面向对象编程
比如我们要实现小红这个对象,我们可以通过下面在这个小明的对象实现

	var xiaoming = {
		name: '小明',
		height: '高一',
		study: function() {
			console.log(this.name + '正在学习');
		}
	};

	var xiaohong = {
		name: '小红'
	};

	xiaohong.__proto__ = xiaoming;//让xiaohong对象的原型指向xiaoming

	xiaohong.study(); //小红正在学习

你可以理解对小红这个对象是以小明为原型创造,或是先将小明这个对象抽象成类,再根据这个类创造小红这个对象。

proto:隐式原型,JS每个对象中内置的属性,用于指向对象的原型对象
由此,可以得出一条原型链,根据对象的__proto__属性一直找,就会得到一条原型链,如定义一个数组 var arr = [1, 2, 3];就会有原型链
arr ----> Array.prototype ----> Object.prototype ----> null
instanceof就是通过__proto__属性,顺着原型链一直寻找来判断的,而xiaohong.proto = xiaoming;就是构建了一条xiaohong->xiaoming的原型链。原型链左端,继承原型链右端的方法。故可以给原型链右端增加公用的方法,使原型链左端都拥有此方法而且省内存。

二、prototype与constructor

JS中函数也是一个对象,故JS可以用构造函数的方法来创建对象

function Student(name) {
    this.name = name;
    this.hello = function () {
        alert('Hello, ' + this.name + '!');
    }
}

var xiaoming = new Student('小明');// 使用new 关键字调用一个函数返回一个对象
xiaoming.name; // '小明'
xiaoming.hello(); // Hello, 小明!

用new Student()创建的对象还从原型上获得了一个constructor属性,它指向函数Student本身
prototype:显示原型,JS每个函数中内置的属性,用于指向函数的原型对象

console.log(Student.prototype.constructor===Student)//true

class

ES6引入了class,使得JS可以定义一个类,与Java相似

class Student {
    constructor(name) {
        this.name = name;
    }

    hello() {
        alert('Hello, ' + this.name + '!');
    }
}

//支持用extends关键词进行类的继承

class PrimaryStudent extends Student {
    constructor(name, grade) {
        super(name); // 记得用super调用父类的构造方法!
        this.grade = grade;
    }

    myGrade() {
        alert('I am at grade ' + this.grade);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值