JavaScript学习笔记

时间:2019-07-25 18:15来源:2020欧洲杯冠军竞猜官方网站
创建对象 Javascript Objects详解,javascriptobjects 创建对象  •对象直接量 var o = { foo : "bar" } •构造函数 var o = new Object(); •原型继承 var p = Object.create(o); 类继承 Javascript对象拥有自有属性和

创建对象

Javascript Objects详解,javascriptobjects

创建对象

 •对象直接量

var o = {
 foo : "bar"
 }

•构造函数

var o = new Object();

•原型继承

var p = Object.create(o);

类继承

Javascript对象拥有自有属性和继承属性。

 •在查询对象o的属性x时,先查找o中的属性x,如果没找到,则查找o的原型对象中的x属性,直到查找到x或者一个原型是null的对象为止

 •在给对象o的x属性赋值时,如果o中已经有一个自有属性x,则改变x的值,若o中不存在属性x,则为o创建一个x属性并赋值

 •也就是说,只有在查询时原型链才会起作用。

var O = {
 x : 1
 };
function P() {
 this.y = 2;
 }
P.prototype = O;
var t = new P();
 console.log(t);
 console.log('x' in t);//true
 console.log(t.hasOwnProperty('x'));//false

可以使用in 或者 hasOwnProperty 来判断对象中是否存在属性。

对象属性

 •遍历对象属性
 
可以使用 for..in 来遍历对象的属性

使用for..in时会遍历到原型链上的属性。遍历顺序是以广度优先遍历

所以使用hasOwnProperty便可以判断是否是对象自有的属性。

 •对象属性的特性
 
使用Object.getOwnPropertyDescriptor()获取对象特定属性的描述符

可写性(writable) 表示对象属性是否可写

例如

var o = {
  foo : 'bar'
}
Object.defineProperty(o, "foo", { writable : false });
o.foo = 'world';
console.log(o.foo);//仍然输出bar

 可枚举性(enumerable) 表示对象属性是否可枚举

例如
 Array中的length等属性的 enumerable是false,所以,

for (p in Array) {
  console.log(p);
}

 什么也不输出

可配置性(configurable) 表示可否修改属性的可配置性和可枚举性

可以用Object.defineProperties来定义这些配置属性。
Object.defineProperty(o, "foo", { writable : false });

 Get 表示获取对象属性的方法
Set 表示设置对象属性的方法

示例

var book = {
  _year: 2004,
  edition: 1
};
Object.defineProperty(book, "year", {
  get: function () {
    console.log('get year');
    return this._year;
  },
  set: function (newValue) {
    console.log('set year');
    if (newValue > 2004) {
      this._year = newValue;
      this.edition  = newValue - 2004;
    }
  }
});
book.year = 2005;//控制台输出‘set year'
console.log(book.year);//控制台输出‘get year'和year的值

 对象方法

toString 将对象转换成字符串,默认的转换会是[object Object]之类的东西,所以需要转成json格式的话可以用JSON.stringify

valueOf 需要将对象转换成其他类型的时候要用到。同样的,默认转换没什么值得说的。
 
可执行对象

通过如下方法可以创建一个可执行对象

function bar(o) {
  var f = function() { return "Hello World!"; }
  o.__proto__ = f.__proto__;
  f.__proto__ = o;
  return f;
}
var o = { x: 5 };
var foo = bar(o);
console.log(foo());
console.log(foo.x);
console.log(typeof foo);//function

 既可以当作对象来使用(有原型链),也可以当作函数来直接调用

枚举对象的属性:通常用for(...in...)来循环遍历,由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能

 •对象直接量

javascript详解

1.为对象的自定义属性,即往window对象添加$和getMouseCoords两个函数,isIE一个属性
由于这3个都是声明在函数外,所以调用时 和 使用var 没有区别
用window.代表是全局的,var 则要根据使用的地方来决定其有效范围
2.简写的if语法 (obj)?true:false 或 (bool)?true:false 括号可以省略
即if(obj!=null) { return "问号后面的值" } else { return "冒号后面的值" }
或if(bool == true){同上}else{}
这里嵌套了两层
if(document.getElementById == null){ //判断当前浏览器是否支持getElementById
return document.getElementById(obj)
} else {
if (document.all == null) { //判断当前浏览器是否支持document.all
return document.all[obj]
}else{
return obj
}
}
3.同上判断是否存在参数a,不存在的话 为a赋值,"!"表示取反
if (!(a != null)) {//即a不存在时,这里a指onmousedown触发时的 鼠标参数(坐标等)
a=window.event;//event代表事件的状态,包括鼠标、键盘的参数
}
layerX 鼠标以事件触发元素内界的左上角横坐标,layerY为纵坐标
如单击按钮时,鼠标相对该按钮左上角横坐标的像素值  

for(var i in foo){

var o = {
 foo : "bar"
 }

javascript详解书籍推荐本,要书名

《javascript权威指南》是一本API参考手册,看得比较枯燥
《javascript高级程序设计》
《javascript设计模式》
《javascript DOM高级程序设计》
《javascript DOM编程艺术》
《高性能javascript》
等等。。  

Objects详解,javascriptobjects 创建对象 对象直接量 var o = { foo : "bar" } 构造函数 var o = new Object(); 原型继承 var p = Object.create(o); 类继承...

    if(foo.hasOwnProperty(i)){

•构造函数

        console.log(i);

var o = new Object();

    }

•原型继承

}

var p = Object.create(o);

推荐总是在for in使用 hasOwnProperty,因为类库被包含在页面中时,不使用 hasOwnProperty 过滤的 for in循环难免会出问题。

类继承

p.hasOwnProperty('x') //检查对象p是否含有自有属性x,若x是继承属性则返回false

Javascript对象拥有自有属性和继承属性。

p.propertyIsEnmuerable('x') //检查属性x是否可被枚举

 •在查询对象o的属性x时,先查找o中的属性x,如果没找到,则查找o的原型对象中的x属性,直到查找到x或者一个原型是null的对象为止

对象继承来的内置方法是不可枚举的,如:toString()

 •在给对象o的x属性赋值时,如果o中已经有一个自有属性x,则改变x的值,若o中不存在属性x,则为o创建一个x属性并赋值

自行添加的属性均是可枚举的,除非被转为不可枚举;

 •也就是说,只有在查询时原型链才会起作用。

Object.keys() 返回一个数组,一个由对象的所有可枚举属性的名字组成的数组;

var O = {
 x : 1
 };
function P() {
 this.y = 2;
 }
P.prototype = O;
var t = new P();
 console.log(t);
 console.log('x' in t);//true
 console.log(t.hasOwnProperty('x'));//false

Object.getOwnPropertyNames() 返回所有自有属性名称组成的数组;

可以使用in 或者 hasOwnProperty 来判断对象中是否存在属性。

function anotherKeys(o){

对象属性

if(typeof o !== 'object') throw TypeError;

 •遍历对象属性
 
可以使用 for..in 来遍历对象的属性

var result = [];

使用for..in时会遍历到原型链上的属性。遍历顺序是以广度优先遍历

for(var prop in o){

所以使用hasOwnProperty便可以判断是否是对象自有的属性。

if(o.hasOwnProperty(prop)) result.push(prop);

 •对象属性的特性
 
使用Object.getOwnPropertyDescriptor()获取对象特定属性的描述符

}

可写性(writable) 表示对象属性是否可写

return result;

例如

}

var o = {
  foo : 'bar'
}
Object.defineProperty(o, "foo", { writable : false });
o.foo = 'world';
console.log(o.foo);//仍然输出bar

 

 可枚举性(enumerable) 表示对象属性是否可枚举

 

例如
 Array中的length等属性的 enumerable是false,所以,

get和set:可将属性定义为只读、只写、可读可写,如:

for (p in Array) {
  console.log(p);
}

var f = {

 什么也不输出

i:0,

可配置性(configurable) 表示可否修改属性的可配置性和可枚举性

get a(){

可以用Object.defineProperties来定义这些配置属性。
Object.defineProperty(o, "foo", { writable : false });

return this.i;

 Get 表示获取对象属性的方法
Set 表示设置对象属性的方法

},

示例

set a(newValue){

var book = {
  _year: 2004,
  edition: 1
};
Object.defineProperty(book, "year", {
  get: function () {
    console.log('get year');
    return this._year;
  },
  set: function (newValue) {
    console.log('set year');
    if (newValue > 2004) {
      this._year = newValue;
      this.edition  = newValue - 2004;
    }
  }
});
book.year = 2005;//控制台输出‘set year'
console.log(book.year);//控制台输出‘get year'和year的值

this.i = newValue;

 对象方法

}

toString 将对象转换成字符串,默认的转换会是[object Object]之类的东西,所以需要转成json格式的话可以用JSON.stringify

 

valueOf 需要将对象转换成其他类型的时候要用到。同样的,默认转换没什么值得说的。
 
可执行对象

}

通过如下方法可以创建一个可执行对象

 

function bar(o) {
  var f = function() { return "Hello World!"; }
  o.__proto__ = f.__proto__;
  f.__proto__ = o;
  return f;
}
var o = { x: 5 };
var foo = bar(o);
console.log(foo());
console.log(foo.x);
console.log(typeof foo);//function

数据属性、存取器属性

 既可以当作对象来使用(有原型链),也可以当作函数来直接调用

数据属性的4个特性:value、 writable、 enumerable、 configurable;

您可能感兴趣的文章:

  • ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验

存取器属性的4个特性:get、 set、 enumerable、 configurable;

属性描述符对象( property descriptor),它的属性名就是这4个特性名;

Object.getOwnPropertyDescriptor(p,'x') 返回p的自有属性x的描述符对象{value:3,writable:true,enumerable:true,configurable:true}

新建属性时,要想它同时具有某种特性,需要调用Object.defineProperty(p,'x',propotyDescriptor)

同时修改多个属性:Object.definePropoties(p,{x:propotyDecriptor,y:propotyDescriptor,....})

 

 

//为新对象p设置属性

var p = Object.defineProperties({},{

x:{value:1,writable:true,enumerable:true,configurable:true},

y:{value:3,writable:true,enumerable:true,configurable:true},

r:{

get:function(){return this.x},

set:function(value){this.x=value*2},

enumerable:true,

configurable:true

}

});

//给Object.prototype添加一个extend()方法,任何对象都是继承自Object,所以任何对象都能调用该方法

Object.defineProperty(Object.prototype,'extend',{

writable:true,

enumerable:false,

configurable:false,

value:function(o){

var names = Object.getOwnPropertyNames(o);

for(var i=0;i<names.length;i ){

if(names[i] in this) continue;

var desc = Object.getOwnPropertyDescriptor(o,names[i]);

Object.defineProperty(this,names[i],desc);

}

}

});

var p1 = {a:1,b:2};

var p2 = {};

p2.extend(p1);

 

console.log('a' in p2); //true

 

属性4个特性修改规则

1.若对象不可扩展,则不能创建新属性,只能更改已有属性;

2.若属性为不可配置的,即configurable:false,则不能更改可配置性、可枚举性等所有特性,包括不能把数据属性和存取属性相互转换,但是唯一可以改的就是:将可写性从true改为false,相反则不行;

 

使用Object.definePropoty()或Object.definePropoties()时违反以上规则,会抛出类型错误异常;

对象的三个属性

每个对象都有与之相关的三个属性:原型属性prototype,类属性class,可扩展性extensible;

对象的原型属性prototype是用来继承属性的,通过对象直接量创建的对象的原型是Object.prototype,通过new创建的对象的原型是构造函数的prototype,通过Object.create(p)创建的对象使用参数p作为它的原型;

不管以何种方式创建的对象都有一个constructor属性,指代原型的构造函数,因此对象的真正原型是constructor.prototype;

Object.getPrototypeOf(p)可以查询对象p的原型,用p.isPrototypeOf(o)来检测对象p是否是对象o的原型;

对象的类属性为一个字符串,表示对象的类型信息,默认的toString()方法返回字符串[object class],然后通过对字符串执行slice(8,-1)来提取对象的类型信息

function classOf(o){

return Object.prototype.toString.call(o).slice(8,-1);

}

classOf(null); //'Null'

classOf(1); //'Number'

classOf(''); //'String'

classOf(false); //'Boolean'

classOf({}); //'Object'

classOf([]); //'Array'

classOf(/./); //'Regexp'

classOf(new Date()); //'Date'

classOf(window); //'Window'

function f(){}

classOf(new f()); //'Object'

可扩展性:是否可以给对象添加新属性,默认均是可扩展的

判断对象p的可扩展性:Object.isExtensible(p); 转换为不可扩展:Object.preventExtensions(p); 此转换不可逆转,只影响对象p本身的可扩展性,对象p仍然可以继承在他的原型上新添加的属性,设为不可扩展目的是锁定对象,避免外界干扰,通常和属性的可配置性与可写性配合使用;

Object.seal(p)封闭对象p,让他的所有自有属性都设置为不可配置,Object.isSealed(p)检查是否封闭;

Object.freeze(p)冻结,更严格地锁定对象p,不可扩展、所有自有属性不可配置、所有数据属性设为只读(具有set方法的存取属性不受此影响),检测Object.isFrozen(p);

锁定、封闭、冻结方法均返回传入的对象;

var o = Object.seal(Object.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));

创建一个封闭对象o,包含一个冻结的原型{x:1}和一个不可枚举的属性y

 

系列化对象:将对象的状态转换为字符串,也可将字符串还原为对象

JSON:JavaScript Object NOtation,(对象表示法)

其JSON.stringify(p)系列化对象p的可枚举的自有属性,JSON.parse(str)字符串还原为对象;

不能系列化的属性在输出字符串时会被省略掉;JSON的语法是JavaScript语法的子集,它只能表示:对象、数组、字符串、无穷大数字、true、false、null,其中NaN、Infinity系列化为null,日期对象系列化为日期字符串且不可还原;

不能系列化和还原:函数、RegExp、Error对象、undefined;

编辑:2020欧洲杯冠军竞猜官方网站 本文来源:JavaScript学习笔记

关键词: 欧洲杯竞猜