- 对象
对象也是一种数据的集合,键值对。[ol]初始化
字面量
对象字面量是以\”{}“作为边界,以多个键值对组成,键与值通过”:“隔开,键值对之间通过”,\”隔开
var obj = {name:“terry”,age:12,gender:“male”} - 构造函数模式
使用Object系统内置的对象构造函数,也可以使用自定义构造函数 Student
var obj = new Object(); // var obj = {};
obj 是对象,也被称为实例
Object是类,也被称为构造函数,构造函数是创建对象的模板
属性访问
读写
- 点访问
var obj = {name:“terry”,age:12,gender:“male”}
对象.属性
var name = obj.name;
obj.name = ‘terry’;
对象[变量]
var name = “age”;
obj[name] // 等价于obj[“age”] 等价于obj.age
属性遍历 (for-in)
打印出某个对象中所有的属性
for(var key in obj){
}
依次从obj中获取属性名赋值给key,通过obj[key]访问属性值
[/ol]
var obj = {name:\"terry\",age:12,sayName:function(){console.log(\"my name is\",this.name)}}console.log(obj);console.log(obj.name);console.log(obj[\"name\"]);var name=\"name\";console.log(obj[name]);
4) 对象序列化将对象转换为字符串的描述,解决对象在io中传递的问题1. 常规转换obj.toString() 显示信息不彻底2. 转换为json字符串JSON.stringify(obj)3. 转换为查询字符串var qs = require(\'querystring\')qs.stringify(obj)
let qs = require(\'querystring\');var obj = {name:\"terry\",age:12}console.log(obj.toString());console.log(JSON.stringify(obj));console.log(qs.stringify(obj));
将字符串转化为数组 Array.from(str)
5) Object
所有构造函数的父构造函数,所有的构造函数都直接间接的继承Object。所有的实例对象都可以调用其构造函数及其父构造函数的原型中的方法
Object.prototype.constructor 获取某个对象的构造函数Object.prototype.toString()Object.prototype.valueOf()Object.prototype.hasOwnProperty() 判断当前属性是否属于自己Object.prototype.isPrototypeOf()Object.prototype.prototypeIsEnumerable() 判断是否可枚举,通过for in循环可以遍历到Object.prototype.toSource()var obj = {}obj.toSource();obj的构造函数是Object,所以obj可以调用Object.prototype的方法var obj = {} // var obj =new Object();obj.toString();arr的构造函数是Array,Array继承Object,因此,arr可以调用Array.prototype及Object.prototype中的方法var arr = new Array(3);arr.toString();6) 删除属性delete 对象.属性对比java对象,js对象有哪些特殊的地方1. js对象的属性可以被删除,java对象属性是固定的2. js对象的属性可以随意添加,java对象属性是固定的3. js对象可以通过字面量及构造函数来获取,java对象只能通过类构建class Student{private String name;private Integer age;public void setName(String name){this.name = name;}public String getName(){return this.name;}}Student student = new Student();student有且只能有两个属性7) 自定义属性var obj = {name:\"terry\"}1. name是可以迭代的,是可读可写假设:1. name是不可以迭代的2. name是不可写的3. name是不可以被删除4. 当对象属性的值发生变化的时候,我想知道?5. 当name、age、gender属性发生变化的时候,都想检测到.var obj = {}obj.name = \"terry\"=>Object.defineProperties(obj,{name:{},gender:{}})Object.defineProperty(obj,\"name\",{ //定义一个属性configurable:true, //是否可配置 默认
*将对象变成只读属性 writable:true, //是否可写 默认
enumerable:true; //是否可迭代 默认
value:“terry”,
set:function(){
},get:function(){}})
代码:var obj = {};
obj.name = “terry”;
console.log(obj);
console.log(\”—————\”);
var o = {};
Object.defineProperty(o,“name”,{
configurable:true,
writable:true,
enumerable:true,
value:“terry”
});
console.log(o);
console.log(\”—————-\”);
Object.defineProperty(o,“name”{
configuration:true,
writable:flase,//将对象变成只读属性
enumerable:true,
value:true
})
o.name = “Larry”;
console.log(o)
//定义多个属性
var vm = {
_data:{
name:“terry”,
age:12,
gender:“male”
}
};
Object.defineProperties(vm,{
name:{
configuravle:true,
enumerable:true,
set.function(name){
this._data.name;
},
get.function(){
return this._data.name;
}
},
age:{
configurable:true,
enumerable:true,
set.function(age){
this._data.age;
},
get.function(){
return this._data.age;
}
},
gender:{
configurable:true, //可配置
enumerable:true, //可迭代
set.function(gender){
this._data.gender;
},
get.function(){
return this._data.gender;
}
}
})
console.log(vm);
console.log(\”————-\”);
console.log(vm.name);//vm可以直接访问_data中的数据
console.log(vm.age);
console.log(vm.gender);
vue model -> 响应式 -> model发生改变一定会引起视图的变化[{name:\"terry\",age:12},{name:\"larry\",age:13},{name:\"tom\",age:13}]====视图(vue,vue源码)===><table><thead><tr><td>编号</td><td>姓名</td><td>年龄</td></tr></thead><tbody><tr><td>1</td><td>terry</td><td>12</td></tr><tr><td>2</td><td>larry</td><td>13</td></tr></tbody></table>
代码:
var obj = {
_age:0,
name:“terry”
}
Object.defineProperty(obj,“age”,{
set:function(v){
console.log(“过生日”);
this.age=v;
},
get:function(){
return this._age;
}
})
obj.age=1;
obj.age++;
console.log(obj.age);
- 函数
函数也是对象,是一个引用数据类型。[ol]分类
不管是普通函数还是构造函数,本质是完全一样的,只不过为了区分它们,我们将构造函数的函数名大写普通函数(方法) - 构造函数(类)
函数声明
函数声明与var声明变量类似,都会有变量的提升。允许在函数声明前调用函数
函数名()
function 函数名(形参){
}
例如:
let result = add(1,2); // 可以执行
function add( a, b){
return a + b;
}
函数表达式
类似于普通的赋值表达式,变量会提升,但是函数初始化不会被提升
add(); // 报错!
var add = function(a,b){
return a + b;
}
函数调用
函数名(实参列表);
add(1,2)
函数名.call(this,实参列表)
add.call(this,1,2)
函数名.apply(this,实参数组)
add.apply(this,[1,2])
[/ol]
- 函数内部属性
兜底对象(全局)
浏览器:window
nodeJs:global
只有在函数的执行过程中,内部属性才能被确定
arguments
保存函数的所有实参,是一个类数组对象。
arguments.callee 指向当前函数,常用语递归函数。但是在严格模式下无法使用
this
当前的执行环境对象
与函数的调用方式有关
如果使用\”()“调用函数,查看”()“是否是函数名,
如果是,查看函数名前有么有点”.\”,
没有点\”.“this指向全局对象。有”.\”this指向点前面的那个对象。
代码:
var arr=[{name:\"terry\",age:12}];for(var key in arr){console.log(\"使用for in:\",key,arr[key]);}console.log(\"使用forEach\");arr.forEach(function(item){console.log(item);})console.log(\"箭头函数this的使用:\");function bar(){var arr=[1,2,3];arr.forEach(function(item){console.log(this);//箭头函数的this指向包含其外部函数的this,调用barconsole.log(item);//调用arr})}bar.call({name:\"terry\"});
5) 箭头函数(ES6)
一般用于回调函数,是回调函数的简写
箭头函数中的this指向包含它的外部函数的this,所有箭头函数一般放在外部函数里面。
function foo(){
[“terry”,“larry”].forEach((item)=>{
console.log(this,item);
})
}
箭头函数this指向foo的this
foo(); //global
foo.call({}) //{}
foo.call({name:“terry”}) //{name:“terry”}
new Vue({
el:\”#app\”,
data:{
students:[]
student{}
},
methods:{
// 加载学生信息
loadStudents(){
// this 指向vue对象
$.get(’/findAllStudent’,(students)=>{
// this指向外部函数this,也就是指向vue对象
this.students = students;
})
}
}
})
6) 函数本质
函数是一种特殊对象,默认情况下,一个函数都会有一个原型对象与之对应,函数中有个指针prototype指向原型对象,原型对象中有个constructor指向函数,你中有我,我中有你。
function foo(){
}
foo.prototype.constructor === foo; //true
你女朋友的男朋友是不是你