面向对象的JavaScript书中的问题: Imagine Array()不存在,并且数组文字表示法也不存在。创建一个名为MyArray()的构造函数,其行为尽可能接近Array()。
我认为测试我的技能将是一个很好的挑战。这就是我想出来的,但它不起作用而且非常不完整..我有点难过:
function MyArray(){
// PRIVATE FIELDS -----------------------
var initialData = arguments;
var storage;
// PRIVATE METHODS ----------------------
function refresh(){ //this doesn't work :(
for(var i = 0; i < storage.length; i++){
this[i] = storage[i]
}
};
function initialize(){
storage = initialData;
refresh();
}
function count(){
var result = 0;
for(var item in this){
//console.log(item, parseInt(item), typeof item);
if(typeof item == 'number'){
result++;
}
}
return result;
};
initialize();
// PUBLIC FIELDS -------------------------
this.length = count();
// PUBLIC METHODS ------------------------
//todo:
this.push = function(item){
refresh();
}
this.pop = function(){}
this.join = function(){}
this.toString = function(){}
}
var c = new MyArray(32,132,11);
console.log(c, c.length);
这不适用于任何生产代码或任何项目..只是为了尝试更多地学习JavaScript。有人可以试着帮我这个代码吗?
答案 0 :(得分:2)
问题是你可以使用arguments对象。它不是使用Array()创建的数组,因此您不会破坏练习的规则。这是你需要做的:
this.length = 0;
for (var i in arguments) {
this[this.length] = arguments[i];
this.length++;
}
我忘了提到任何对象都是一个关联数组,所以为练习应用关联数组并不是错误的,因为我们不使用Array()对象本身。
问题的作者:在您的示例中,您使用:此[“i”] =存储[i] 等于 this.i = storage [i] 。尝试删除引号并将其用作 this [i] = storage [i]
答案 1 :(得分:0)
for(var item in this){
if(typeof item == 'number')
属性名称始终是字符串。您需要检查它是否是从0到MaxArrayLength的数字的字符串表示形式。你可以做例如
for (var i=0; i<4294967296; i++)
if (i in this)
result = i;
您可能也对these articles或official specification for Array behaviour感兴趣。
答案 2 :(得分:0)
我目前正在浏览这本书,我可能应该尝试一些更新的东西,但它还没有过时,而且校长仍然合理......我认为它们很好。
无论如何,我选择了一个稍微不同的解决方案,尽管我从操作系统中获取了灵感来解决他是如何处理字符串的。我认为这个练习的挑战不是创造更多阵列......否则......这是一个疯狂的挑战,特别是对于刚接触该语言的人。
var MyArray = function () {
var args = arguments;
var length = 0;
for each(var item in args) {
this[length++] = item;
}
this.toString = function () {
var result = args[0];
for (var i = 1; i < args.length; i++) {
result += ',' + args[i];
}
return result;
}
this.length = length;
this.push = function (push) {
var newLength = args.length++;
args[newLength] = push;
this[newLength] = push;
return ++length;
}
this.pop = function () {
delete args[--args.length];
delete this[args.length];
length--;
return args;
}
this.join = function(joiner){
if(typeof arguments[0] === "undefined"){
joiner = ',';
}
var result = args[0];
for (var i = 1; i < args.length; i++) {
result += joiner + args[i];
}
return result;
}
}
var a = new MyArray(1, 2, 3, 'test');
console.log(a.toString());
console.log(a[a.length - 1]);
console.log(a.push('boo'));
console.log(a.toString());
console.log(a.pop());
console.log(a.toString());
console.log(a.join(','));
a.join(' isn\'t ');
答案 3 :(得分:0)
我的解决方法是:
function MyArray() {
this.length = 0;
for(i = 0; i < arguments.length; i++) {
this[this.length] = arguments[i];
this.length++;
}
this.toString = function(joiner = ',') {
let str = this[0] ? this[0] : '';
for(i=1;i<this.length; i++) {
str+= joiner + this[i];
}
return str;
};
this.push = function(value) {
this[this.length++] = value;
return this.length;
};
this.pop = function() {
let value = this[this.length -1];
delete this[--this.length]
return value;
};
this.join = function(joiner) {
return this.toString(joiner);
}
}