js构造函数、索引数组和属性的实现方式和使用

前端之家收集整理的这篇文章主要介绍了js构造函数、索引数组和属性的实现方式和使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<div class="jb51code">
<pre class="brush:js;">

存在的问题

1.由于所有的实例都是复制了同一个方法所定义的实体,所以效率(内存效率与执行效率低下),可通过原型继承解决 2.无法对属性值进行访问控制(private,Public)可通过闭包解决 属性访问的运算对象不是变量而是对象的引用 仅读取数值的整数部分的处理 Math[this<0?'celling':'floor'](this);

关联数组

在js中必须通过对象才能实现关联数组 基本操作 通过键取值,元素的设定,元素的删除

var map={x:3,y:4}; p(map.x); delete map.x; //true p(map.x); //undefined 对不存在的元素进行访问结果是undefined,由于可以显示地将值设置为undefined ,因此无法通过将值与undefined比较来判断值是否存在 ,可以通过for in进行枚举 a='undefined'; p(a);//undefined p(typeof map.x==a); //true

作为关联数组应该注意的点

function Myclass(x,y){ this.x=x; this.y=y; } Myclass.prototype.z=5; var obj=new Myclass(1,2); for(var key in obj){ p(key+":"+obj[key]); //会枚举出通过原型继承来的属性 } //x:1 y:2 z:5 delete obj.x;//true p(obj.x); //undefined p(obj.z); //5 //通过原型继承来的属性 无法被delete删除 delete obj.z; //true p(obj.z);//5 //在将对象作为关联数组使用时,通常都会使用字面量来创建,即使视图通过使用空的对象字面量来创建一个没有元素的关联数组,也仍会从Object类中继承原型的属性 p('toString' in obj); //true var obj1={}; p('toString' in obj1);//true //通过 for in枚举 p(obj1.length); //undefined for(var k in obj1){ p(obj1[k]); } //没有元素 被枚举出来 这是由于enumerable属性的缘故 //通过hasOwnProperty来判断 是本身的属性还是通过 参与原型继承而来的属性 var map={}; p(map.hasOwnProperty('toString')); //false map['toString']=1; p(map.hasOwnProperty('toString')); //true delete map['toString'] ; p(map.hasOwnProperty('toString'));//false

属性属性

对象的属性 也是有些属性的 如下表总结了在ECMAScript第五版定义了的属性属性值被定为为值属性 表格1

属性属性

含义

writable

可以改写属性的值

enumerable

可以通过for in枚举出

configurable

可以改变属性属性,可以删除属性

get

可以指定属性值的getter函数

set

可以指定属性值的setter函数

不可变对象

生成之后状态不能再被改变的对象,字符串对象就是典型的不可变对象 灵活运用不可变对象可以提高程序的健壮性,比如在将传递给方法参数时,存在方法对对象内容的改写等 js中可通过以下方式实现不可变对象 1.将属性(状态隐藏藏),不提供变更操作(闭包实现) 2.灵活运用ECMAScript第五版提供的函数 3.灵活运用writable,configurable属性以及setter和getter ECMAScript第五版中用于支持对象不可变的函数 见下表格

方法

属性新增

属性删除

属性值变更

确认方法

preventExtensions

x

o

o

Object.isExtensible

seal

x

x

o

Object.isSealed

freeze

x

x

x

Object.isFrozen

Object.preventExtensions例子

var obj={x:2,y:3}; Object.preventExtensions(obj); //无法新增属性 obj.z=4; p(Object.keys(obj));//x,y //可以删除属性 delete obj.y; p(Object.keys(obj)); //x //可以更改属性值 obj.x=20; p(obj.x); //20

//Object.seal例子 将属性的configurable设置为假
var obj={x:2,y:3};
Object.seal(obj);
//无法新增 也无法删除
obj.z=3;
p(Object.keys(obj)); //x,y
delete obj.x; //false
p(Object.keys(obj));//x,y
//可以改变 属性
obj.x=20;
p(obj.x);//20

//Object.freeze例子 将属性的writable设置为假
var obj={x:2,y:3};
Object.freeze(obj);
//无法新增 也无法删除,也无法改变属性
obj.z=3;
p(Object.keys(obj)); //x,y
delete obj.x;
p(Object.keys(obj));//x,y
//可以改变 属性
obj.x=20;
p(obj.x);//20

需要注意 1.对于以上三种方法一旦更改就无法还原 2.如果想让原型继承中的被继承的方法也不可改变,需要对其进行显示操作

原文链接:https://www.f2er.com/js/57303.html

猜你在找的JavaScript相关文章