《一》prototype
prototype其实是函数的一个属性,并且只有函数有这个属性,这个属性就是给函数增加函数或者属性的,比如写一个
function one(){},那么one.prototype的类型就是一个对象,使用JSON.stringify(one.prototype)得到的就是一个字符串类型的{}了,显然是一个空的对象。
我添加一个name属性试试,one.prototype.name="这是文本",再JSON.stringify(one.prototype)得到:{‘name’:'这是文本'}。
一个函数其实也是可以变成一个对象的,通过new 函数名 变成对象,这样就可以访问函数里边的对象或者属性了。
我来举个函数添加属性和函数的例子:
function one(){
this.index=1;
}
one.prototype.two=function(e){
return this.index;//返回one里边的index值1,这里的this是one
//return {value:this.index,name:e}//返回的是一个对象
}
var test=new one();//函数对象化
test.hasOwnProperty('index')//判断是否有index这个属性
test;//object{index:1,prototype:two}
test.index;//1
test.two;//返回two函数
test.two();//返回运行后的函数结果,里边是this.index值为1
还有一种写法,是对one进行扩展的,如下:
function one(){
this.index=1;
}
one.prototype=function(){
describe:'version1',
two:function(){//因为two在这里是种对象里的方法,所以写成这样,很多封装好的库里都是这样,比如jQuery
return this.index;
}
}
var test=new one();
test.two();
《二》循环遍历
这个遍历数组或者对象,首先得到的是索引或者是key值,比如
var arr=[3,4,1];
for(var index in arr){
console.log(index)//1,2,3
console.log(arr[index])//3,4,1
}
var obj={name:'wang',age:11};
for(var index in obj){
console.log(index);//name,age
console.log(obj(index);//wang,11
}
而of是直接获取值了。
再补充其他几种循环遍历的方法:
数组原生具备iterator
接口(即默认部署了Symbol.iterator
属性),for...of
循环本质上就是调用这个接口产生的遍历器,可以用下面的代码证明。
const arr = ['red', 'green', 'blue'];
for(let v of arr) {
console.log(v); // red green blue
}
const obj = {};
obj[Symbol.iterator] = arr[Symbol.iterator].bind(arr);
for(let v of obj) {
console.log(v); // red green blue
}
上面代码中,空对象obj
部署了数组arr
的Symbol.iterator
属性,结果obj
的for...of
循环,产生了与arr
完全一样的结果。
for...of
循环可以代替数组实例的forEach
方法。
const arr = ['red', 'green', 'blue'];
arr.forEach(function (element, index) {
console.log(element); // red green blue
console.log(index); // 0 1 2
});
JavaScript 原有的for...in
循环,只能获得对象的键名,不能直接获取键值。ES6 提供for...of
循环,允许遍历获得键值。
var arr = ['a', 'b', 'c', 'd'];
for (let a in arr) {
console.log(a); // 0 1 2 3
}
for (let a of arr) {
console.log(a); // a b c d
}
上面代码表明,for...in
循环读取键名,for...of
循环读取键值。如果要通过for...of
循环,获取数组的索引,可以借助数组实例的entries
方法和keys
方法(参见《数组的扩展》一章)。
for...of
循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。这一点跟for...in
循环也不一样。
let arr = [3, 5, 7];
arr.foo = 'hello';
for (let i in arr) {
console.log(i); // "0", "1", "2", "foo"
}
for (let i of arr) {
console.log(i); // "3", "5", "7"
}
上面代码中,for...of
循环不会返回数组arr
的foo
属性。
参考“https://www.cnblogs.com/loveyoume/p/6112044.html”