function ListNode(value,next) { //类的定义
this.val = value;
this.next = next;
this.getVal = function(){
return val;
}
}
node1 = new ListNode(10,null); //实例化
function DoubleListNode(pre) { //类的继承
this.pre = pre; //声明该子类特有的变量
}
class DoubleListNode.prototype = node1;
ES6
class ListNode { //类的定义
val; //可以不要
next = null;//可以不要
constructor(value, next) {
this.val = value;
this.next = next;
}
getVal = function(){
return val;
}
}
node1 = new ListNode(10,null); //实例化
class DoubleListNode extends ListNode { //类的继承
constructor(value, next, pre) {
super(value, next); //调用父辈的构造函数
this.pre = pre; //声明该子类特有的变量
}
}
原型prototype,构造函数,实例三者的关系
每一个函数都有一个prototype属性,称为该函数(可以看作构造器)的原型对象;
每一个对象都有__proto__属性,指向创造该对象的构造函数的prototype;
所有对象都是Object对象的后代,所有对象.__proto__.__proto__...最终指向Object.prototype
函数也是一种对象,所有函数都是通过Function()这个顶级构造器构造的,所以 任意函数.__proto__===Function.prototype;
Function.prototype又是一个对象,由Object()构造函数创建,所以Function.prototype.__proto__===Object.prototype;
Object()这个构造函数也是函数,所以Object.__proto__===Function.prototype;
实例化创建对象的过程把一个函数当成普通函数调用时,结果为函数的返回值;
当成构造函数调用时,结果为该构造函数作为类名的一个新创建的对象。
具体流程function Father(name){
this.name = name;
}
var son = new Father(‘sonName’);
1.创建一个新对象:son;
2.新对象会被执行__proto__连接:相当于执行son.__proto__ = Father.prototype;
3.新对象和函数调用的this会绑定起来:相当于执行Father.call(son,‘sonName’);
4.执行构造函数中的代码:son.name = ‘sonName’;
5.如果函数没有返回值,那么就自动返回这个新对象:return this;
原型链每一个对象都有__proto__属性,而obj.__proto__也是一个对象,也会有__proto__属性
故obj.__proto__.__proto__...形成一条链状结构称为原型链。
所有对象都是Object对象的后代,所有对象.__proto__.__proto__...最终指向Object.prototype,而Object.prototype.__proto__===null。
对于一个对象,访问某个方法或属性时,会沿着原型链向上查找,直到找到或达到Object.prototype为止。
instanceof运算符object1 instanceof constructor1 //返回boolean值
instanceof 运算符用来检测 constructor1.prototype 是否存在于参数 object1 的原型链上。
可用于判断某个实例是否是某个类的实例或继承自某个类的类的实例,向上追溯来找到结果
in使用in检查对象中是否有某个属性时,会按照原型链查找,只要在原型链中找到就返回true;
语法:node1 = new DoubleListNode(), "val" in node1 //返回true,因为node1由DoubleListNode构造,他的父辈ListNode包含val这一属性;
hasOwnProperty( )方法可以检查对象自身是否含有该属性,而不会查找原型链。
语法:node1 = new DoubleListNode(), node1.hasOwnProperty('val') //返回false,因为DoubleListNode自身不含val,这一属性包含在他的父辈ListNode中。
原型链的作用数据继承,实现数据共享,节省内存空间。
eg:如果在构造函数中写入方法,那么每定义一个实例都要单独开辟空间存放它自己的该方法,浪费内存空间,可以将该方法变成所有该类的实例共享的方法,做法是将该方法添加到实例的构造函数中:constructor1.prototype.fun1 = function(){ }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)