JavaScript不区分类和实例的概念,而是经过原型(prototype)来实现面向对象编程。java
var stu = { name : 'name', age : 23 } var xiaoming = { name : 'xiaoming' } xiaoming.__proto__ = stu;//把xiaoming的原型指向了stu,看起来像是继承了;
在编写JavaScript代码时,不要直接用obj.proto__去改变一个对象的原型,而且,低版本的IE也没法使用__proto。Object.create()方法能够传入一个原型对象,并建立一个基于该原型的新对象,可是新对象什么属性都没有。编程
//原型对象; var stu = { name : 'name', age : 23 } function createStu(name){ //基于stu原型建立一个新对象 var obj = Object.create(stu); //初始化新对象; s.name = name; return obj; }
javaScript对每一个建立的对象都会设置一个原型,指向它的原型对象。 当咱们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,若是没有找到,就到其原型对象上找,若是尚未找到,就一直上溯到Object.prototype对象,最后,若是尚未找到,就只能返回undefined。函数
var arr = [1, 3, 5] //原型链 arr ----> Array.prototype---->Object.prototype ----> null function foo() { return 0; } //原型链 foo ----> Function.prototype ----> Object.prototype ----> null
对象的构造函数this
function Students(name) { this.name = name; this.hello = function (){ console.log('create student, name:' + this.name); } } var stu = new Students('xiaoli'); //原型链 stu ----> Students ----> Object.prototype ----> null
用new xxx()建立的对象还从原型上得到了一个constructor属性,它指向函数Student自己:prototype
调用构造函数千万不要忘记写new。为了区分普通函数和构造函数,按照约定,构造函数首字母应当大写,而普通函数首字母应当小写.code
定义对象和继承:对象
class Student { constructor(name) { this.name = name; } hello (){ alert('Hello, ' + this.name); } } class PrimaryStudent extends Student { constructor(name, grade) { super(name); this.grade = grade; } myGrade(){ alert('I am at grade ' + this.grade); } }