从 Class OO 到对象委托模式的序列
Sequence from Class OO to Object Delegation pattern
我的意图是使用函数 logFive2 迭代
像 ArraySeq2 或 RangeSeq2 这样的序列对象,尽管我想使用对象委托模式创建 RangeSeq2 并远离 Class 之类的方式(ArraySeq2)。我对 RangeSeq2 做错了什么?
我的代码不起作用,因为 logFive2 没有遍历 RangeSeq2,我不明白为什么。如果您对出了什么问题有任何想法,请告诉我。谢谢你。
function logFive2(sequence){
for(var i = 0; i < 5 && sequence != null; i++){
console.log(sequence.head());
sequence = sequence.rest();
}
}
function ArraySeq2(array,offset){
this.array = array;
this.offset = offset;
}
ArraySeq2.prototype.rest = function(){
console.log("to follow " + this.offset);
return ArraySeq2.make(this.array,this.offset + 1);
};
ArraySeq2.prototype.head = function(){
return this.array[this.offset];
};
ArraySeq2.make = function(array,offset){
if(offset == null) offset = 0;
if(offset >= array.length)
return null;
else return new ArraySeq2(array,offset);
}
logFive2(ArraySeq2.make([1, 2,5,6,9,11]));
// → 1
// → 2
上面的部分工作正常______________ RangeSeq2 对象这是我的问题
var RangeSeq2 = {
init: function(from,to){
this.from = from;
this.to = to;
},
rest: function(){
if (from > to)
return null;
else
return this.init(this.from + 1,this.to);
},
head: function(){
return this.from;
}
};
var RangeTT = Object.create(RangeSeq2);
RangeTT.init(100,1000);
logFive2(RangeTT.init(100,1000));
function logFive2(sequence){
for(var i = 0; i < 5 ; i++){
console.log(sequence.head());
sequence.rest();
}
}
var RangeSeq2 = {
rest: function(){
if (this.from > this.to) {
return null;
}
else
return this.from += 1,this.to;
},
head: function(){
return this.from;
}
};
var RangeTT = Object.create(RangeSeq2);
RangeTT.from = 100;
RangeTT.to = 1000;
logFive2(RangeTT);
//100
//101
//102
//103
//104
解决了!问题比我想象的要简单得多。
我的问题是试图对对象委托进行经典继承和实例化的不健康混合,因为我不明白它是如何工作的。
很快我就理解了 "this" 是如何工作的,很快我就理解了 Object.create (非常强大), __proto__ 并且知道它与函数 Object.prototype 相比的区别我可以找到解决方案。
1.My 我认为第一个错误是试图通过调用方法 init() 在对象中创建状态,而没有 属性 来保存对象中的值。
2.The rest() 方法将查询对象上不存在的变量。
我不得不提到我必须更改迭代器函数 LogFive2() 以适合我的对象委托设计。
我的意图是使用函数 logFive2 迭代 像 ArraySeq2 或 RangeSeq2 这样的序列对象,尽管我想使用对象委托模式创建 RangeSeq2 并远离 Class 之类的方式(ArraySeq2)。我对 RangeSeq2 做错了什么? 我的代码不起作用,因为 logFive2 没有遍历 RangeSeq2,我不明白为什么。如果您对出了什么问题有任何想法,请告诉我。谢谢你。
function logFive2(sequence){
for(var i = 0; i < 5 && sequence != null; i++){
console.log(sequence.head());
sequence = sequence.rest();
}
}
function ArraySeq2(array,offset){
this.array = array;
this.offset = offset;
}
ArraySeq2.prototype.rest = function(){
console.log("to follow " + this.offset);
return ArraySeq2.make(this.array,this.offset + 1);
};
ArraySeq2.prototype.head = function(){
return this.array[this.offset];
};
ArraySeq2.make = function(array,offset){
if(offset == null) offset = 0;
if(offset >= array.length)
return null;
else return new ArraySeq2(array,offset);
}
logFive2(ArraySeq2.make([1, 2,5,6,9,11]));
// → 1
// → 2
上面的部分工作正常______________ RangeSeq2 对象这是我的问题
var RangeSeq2 = {
init: function(from,to){
this.from = from;
this.to = to;
},
rest: function(){
if (from > to)
return null;
else
return this.init(this.from + 1,this.to);
},
head: function(){
return this.from;
}
};
var RangeTT = Object.create(RangeSeq2);
RangeTT.init(100,1000);
logFive2(RangeTT.init(100,1000));
function logFive2(sequence){
for(var i = 0; i < 5 ; i++){
console.log(sequence.head());
sequence.rest();
}
}
var RangeSeq2 = {
rest: function(){
if (this.from > this.to) {
return null;
}
else
return this.from += 1,this.to;
},
head: function(){
return this.from;
}
};
var RangeTT = Object.create(RangeSeq2);
RangeTT.from = 100;
RangeTT.to = 1000;
logFive2(RangeTT);
//100
//101
//102
//103
//104
解决了!问题比我想象的要简单得多。 我的问题是试图对对象委托进行经典继承和实例化的不健康混合,因为我不明白它是如何工作的。 很快我就理解了 "this" 是如何工作的,很快我就理解了 Object.create (非常强大), __proto__ 并且知道它与函数 Object.prototype 相比的区别我可以找到解决方案。
1.My 我认为第一个错误是试图通过调用方法 init() 在对象中创建状态,而没有 属性 来保存对象中的值。
2.The rest() 方法将查询对象上不存在的变量。
我不得不提到我必须更改迭代器函数 LogFive2() 以适合我的对象委托设计。