/**js的面相对象练习
* Created by liyanq on 17/2/21.
* 参考:http://coolshell.cn/articles/6441.html
* http://blog.csdn.net/liyanq528/article/details/52912252
* 以前写过一次,感觉不熟练,再写一次。
*/
/*1:如果一个函数作为类来使用,函数名开头要大写。
*2:Person(name, age)相当于构造函数constructor.
*3:不加this是私有的,相当于private
*4:不论是成员变量还是成员函数,都是按照构造函数->原型的顺序来找。
*5:Object.getPrototypeOf获取对象的原型.
*6:子类中,在不创建父类对象情况下,只能继承父类的原型方法,不能继承构造函数中的成员方法。
* */
function Person(name) {//定义构造函数=Person.prototype.constructor
var privateVar = {privateName: "privateName"};//定义私有变量
this.name = name;//定义成员变量
this.showInfo = function () {//定义成员方法,早于prototype里面定义调用
console.log("this.showInfo:" + this.name + ":" + privateVar["privateName"]);
};
}
Person.prototype.name = "Person.prototype.name";
Person.prototype.showInfo = function () {
console.log("Person.prototype:" + this.name + this.readOnlyName);
};
Object.defineProperty(Person.prototype, "readOnlyName", {
value: "readOnlyProperty",
writable: false
});
var obj = new Person("Peter");//创建对象
obj.showInfo();//this.showInfo:Peter
Person.name = "Person";//定义类变量
Person.classFun = function () {//定义类方法
console.log("classFun:" + this.name);
};
Person.classFun();//调用类方法:classFun:Person
function Student(name) {//构造函数继承;轻松实现多重继承啊
// Person.apply(this, arguments);//整个复制了一遍构造函数,包括私有的。
Object.getPrototypeOf(Person.prototype).constructor.call(this);//整个复制了一遍构造函数,包括私有的。
this.showInfo = function () {//覆盖父类方法
Object.getPrototypeOf(this).showInfo.call(this);
//子类的内容
};
}
Student.prototype = Object.create(Person.prototype);//原型继承,classFun()没继承过来。
var s1 = new Student("Student1");
s1.showInfo();//Person.prototype:Student1
var s2 = Object.create(Person.prototype);
s2.showInfo();//Person.prototype:Person.prototype.name
console.log(obj instanceof Student);//false
console.log(s1 instanceof Person);//true