你不知道的javaScript笔记(3)

对象

对象可以通过两种形式定义: 声明形式和构造形式

声明形式语法: var myObj = {key:value}

构造形式语法: var myObj = new Object(); myObj.key = value;

类型: 语言类型有六种 : string number boolean null undefined object

内置对象: String Number Boolean Object Function Array Date RegExp Error

var myObject = {
    a:2
}
      myObject.a; //2    属性访问
      myObject["a"] // 2  键访问

ES6 可计算属性名

var prefix  = "foo";
var myObject = {
[prefix + "bar"] : "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world

1.writable   决定是否可以修改属性的值

var myObject = {};
Object.defineProperty(myObject,"a",{
value:2,
writable:false, // 不可写!
configurable: true,
enumerable: true
});
myObject.a = 3;
myObject.a;   // 2

2.configurable

只要属性是可配置的,就可以使用defineProperty(..) 方法来修改描述属性。

var myObject = {
a : 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty(myObject,"a",{
value: 4,
writable:true,
configurable:false,// 不可配置
enumerable: ture
});
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty(myObject,"a",{
value: 6,
writable:true,
configurable:true,
enumerable: ture
})   // TypeError

configurable 修改成flash 是单向的,无法撤销

delete只用来删除对象的可删除属性。

var myObject = {
a:2
};
myObject.a  //2
delete myObject.a;
myObject.a // undefined

3.enumerable    控制的是属性是否出现在对象的属性枚举中。

1.对象常量,结合writable: false 和configurable: false 就可以创建一个真正的常量属性

(不可修改,重定义或者删除)。

var myObject = {};
Object.defineProperty(myObject,"FAVORITE_NUMBER",{
value:42,
writable: false,
configurable: false
})

2.禁止扩展

禁止一个对象添加新属性并保留已有属性,可以使用Object.preventExtensions(...)

  var myObject = {
a:2
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.a; // undefined

3.封存

Object.seal(...) 会创建一个 “封存的对象”,这个方法实际上会在一个现有对象上调用

Object.preventExtensions(...) 并把所有属性标记为configurable:false.

4.冻结

Object.freeze(...) 会创建一个冻结对象,这个方法实际上是会在一个现有对象上调用

Object.seal(...) ,还可以深度冻结一个对象。

Getter和Setter

var  myObject = {
// 给 a 定义一个getter
get a() {
return 2;
}
}
myObject.a = 3;
myObject.a;  // 2

由于只定义了 a 的getter,所以对a 的值进行设置时set 操作会忽略赋值操作,不会抛出错误。

通常来讲getter 和setter是成对出现的

var myObject = {
// 给 a 定义一个getter
get a() {
return this._a_;
},
// 给 a 定义一个setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 2

存在性

可以在不访问属性的情况下判断对象中是否存在这个属性:

var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOWnProper("a"); // true
myObject.hasOwnProperty("b"); // false

in 操作符会检查属性是否在对象及[[Prototype]]原型链中。

hasOwnProperty(...) 只会检查属性是否在myObject对象中。

判断属性是否可枚举:

var  myObject = {};
Object.defineProperty(
myObject,
"a",
// 让a像普通属性一样可枚举
{enumerable: true,value:2}
);
Object.defineProperty(
myObject,
"b",
// 让b 不可枚举
{enumerable: false,value:3}
)
myObject.propertyIsEnumberable("a"); // true
myObject.propertyIsEnumber("b"); // false
Object.keys(myObject);  // ["a"]
Object.getOwnPropertyName(myObject); // ["a","b"]

propertyIsEnumerable(...)  会检查给定的属性名是否直接存在于对象中(而不是在原型链)并且满足enumerable:true

Object.keys(...) 会返回一个数组,包含所有可枚举属性

Object.getOwnPropertyNames(...) 返回一个数组,包含所有属性,无论是否可枚举

遍历

 for .. in 可以用来遍历对象的可枚举属性列表

对于数值索引的数组来说,可以使用标准的for 循环

ES5 中新增的   forEach(..)  every(...)  some(..)

forEach(...) 会遍历数组中所有值并忽略回调函数的的返回值。

every(...) 会一直运行到回调函数返回false

some(...) 会一直运行到回调函数返回true

Es6 增加  for .. of 循环语法

  var myArray = [ 1,2,3];
  for(var v of myArray){
  console.log(v)
  }

普通的对象没有@@iterator,可以给任何想遍历的对象自定义

var myObject = {
  a:2,
  b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys(o);
return {
next: function(){
value: o[ks[idx++]],
done:(idx > ks.length)
}
}
}
})
// 手动遍历myObject
var it = myObject[Symbol.iterator]();
it.next(); // {value:2,done: false}
it.next(); // {value:3,done: false}
it.next(); // {undefined,done: true}
// 用 for..of 遍历myObject
for(var v of myObject){
  console.log(v)
}  // 2 // 3

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

Javascript构造函数

     构造函数注意事项: 1.默认函数首字母大写 2.构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new...

35911
来自专栏coding for love

JS原生引用类型解析1-Object类型

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

941
来自专栏平凡文摘

深入理解Java类型信息(Class对象)与反射机制

1453
来自专栏java一日一条

ava enum(枚举)使用详解 + 总结

enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

1603
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

Java反射研究和实践

本博文中项目代码已开源下载地址:GitHub Java反射研究和实践 概述 Java的反射机制是Java语言动态性的一种体现。反射机制是通过反射API来实现的,...

3458
来自专栏水击三千

浅谈JavaScript的面向对象程序设计(一)

  面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象。但是JavaScript中没有类的概念,因此JavaScript与其...

2747
来自专栏coding for love

JS入门难点解析12-继承的实现方式与优缺点

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

1783
来自专栏二进制文集

Java 反射详解

反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为。

1143
来自专栏猿学

猿学-深入理解Java中的反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对...

410
来自专栏开发之途

重拾Java(8)-反射

3417

扫码关注云+社区

领取腾讯云代金券