JS中的prototype 值得思考的几个问题

本文深入探讨JavaScript中原型链继承的问题,特别是引用类型的处理方式。通过具体示例对比不同继承方式的效果,包括直接引用和借用继承等,展示了如何实现更安全、独立的属性继承。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

补充下博主关于原型链继承的几个问题: 
1.原型链中的引用类型。 
2.原型链不要互相依赖,GC可没那么好心帮你创建一个临时存储区域。

1 function base () {
this.arr = [];

function sub (){ 


sub.prototype= new base(); 
var a = new sub(); 
var b = new sub(); 
console.log(b.arr.length); //0
a.arr[0]='moersing'; 
console.log(b.arr.length); //1

可以看出,arr是一个共享的,如果说不适用this.arr而用 var arr = [] 的话,sub访问不到,只能通过父类的闭包来访问,但是问题还是存在的。如果想继承一个完全独立的引用类型: 
第一 : 
function base () {
this.arr = [];

function sub (){ 
base.call(this);// 先加上一个实例属性

sub.prototype= new base(); 
var a = new sub(); 
var b = new sub(); 
console.log(b.arr.length); //0
a.arr[0]='moersing'; 
console.log(b.arr.length); //0 
console.log(a.arr.length); //修改了a,b不受影响 
这个问题可以解决,但是不完美,可以看出, a和b有一个实例属性arr和一个prototype的arr,也就是说。 
a.arr[0] = 'moersing' ; 
console.log(a.arr.length); //1 
delete a.arr; //把属性实例干掉 
console.log(a.arr.length);// 这个时候访问的是 prototype的。 
所以,理论上来讲,这并不能算是完美的,变量也是需要内存的不是吗?好OK,那么,接下来,使用另一种,上面那个叫 借用继承。 
接下来这种方式比较完美,但是也不是那么复杂,主要是使用借用继承的思想罢了,也就是说,借用实例和借用原型分开。 
function base() {
this.arr = [];
}
base.Constructor = function () { //添加一个原型构造函数
//这里判断一下,如果是一个函数,并且不是一个正则表达式对象,IE7会把正则反映成一个function而不是一个object
if (typeof this === 'function' && typeof this.prototype.source === 'undefined') {
var fn = this.prototype;
fn.name = 'moersing';
fn.age = '18';
fn.getFull = function () {
console.log(this.name + '|' + this.age);
};
}
else {
throw new TypeError('this is not a function');
}
};
function sub() {
base.call(this); //借用构造函数,实例化一个实例属性
}
base.Constructor.call(sub); //再调用父类的方法,构造出一个prototype的。
var a = new sub();
var b = new sub();
a.arr[0] = 'moersing'; //给a实例的引用类型添加一个元素
console.log(a.arr.length); //结果是1
console.log(b.arr.length); //结果是0,也就是没有收到影响
console.log(a.name); //打印a.prototype的属性
console.log(b.name); //打印b.prototype的属性
b.name = 'linfo'; //修改b的。
console.log(b.name); //linfo
console.log(a.name); //a没有影响,还是moersing
a.getFull(); //moerisng|18
b.getFull(); //linfo |18

以上是个人的几个原型使用的观点,如果有什么错误,请博主指正批评。

转载于:https://my.oschina.net/u/615191/blog/502506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值