1:创建对象
var employee
= {
name
: "z",
age
: 20,
num
: 4,
signIn
: function(){
console
.log("创建对象");
}
}
var employee2
= new object();
employee2
.name
= "w";
employee2
.signIn = function(){
console
.log("创建对象");
}
2:对象属性 key : value
var employee
= {
name
: "z",
age
: 20,
num
: 4,
signIn
: function(){
console
.log("创建对象");
}
}
console
.log(employee
.name
);
console
.log(employee
["name"]);
employee
.name
= "w";
console
.log(employee
.name
);
employee
["name"] = "a";
console
.log(employee
.name
);
employee
.sex
= "男";
console
.log(employee
.sex
);
var employee2
= {
name
: "z",
"bir-date" : "1989-1-1"
}
console
.log(employee2
["bir-date"]);
3:省略 key
var name
= "z";
var employee
= {
name
,
signIn(){
console
.log("函数");
}
}
console
.log(employee
.name
);
console
.log(employee
.signIn());
4:遍历对象属性 object.keys(对象名),输出对象的所有属性名(key in 对象名)
var employee
= {
name
: "z",
age
: 20,
num
: 4,
signIn
: function(){
console
.log("创建对象");
}
}
console
.log(object
.keys(employee
));
for(key
in employee
){
console
.log(key
);
}
5:删除对象属性(delete 数组名.key)
var employee
= {
name
: "z",
age
: 20,
num
: 4,
signIn
: function(){
console
.log("创建对象");
}
}
delete employee
.num
;
console
.log(employee
);
6:构造函数
function Employee(name
,age
){
this.name
= name
;
this.age
= age
;
}
var emp1
= new Employee("z",18);
console
.log(emp1
);
7:关键字this
var emp
= {
name
: "z",
age
: 20,
signIn(){
console
.log(this.name
+this.age
);
}
}
emp
.signIn();
emp
.empAge = function(){
console
.log(this.name
+ "abc");
}
emp
.empAge();
function Employee(name
,age
){
this.name
= name
;
this.age
= age
;
signIn = () =>{
console
.log(this.name
);
}
}
var emp1
= new Employee("z",20);
emp1
.signIn();
8:getter和setters(关键字get读的属性,set写的属性,set定义的函数只能接收一个参数)
var person
= {
firseName
: "三",
lastName
: "张",
get fullName(){
return this.firstName
+ this.lastName
;
},
set fullName(fullName
){
var [firstName
,lastName
] = fullname
.split(",");
this.firstName
= firstName
;
this.lastName
= lastName
;
}
}
console
.log(person
.fullName
);
person
.fullName
= "李,四";
console
.log(person
.fullName
);
console
.log(person
.firstName
,person
.lastName
);
function Employee(name
,position
){
this,name
= name
;
this.position
= position
;
}
var emp1
= Employee("王五","前端工程师");
Object
.defineProperty(emp1
, "info" ,{
get : function(){
return this.name
+ " " + this.position
;
},
set : function(info
){
var [name
,position
] = info
.split(" ");
this.name
= name
;
this.position
= position
;
}
}
console
.log(emp1
.info
);
emp1
.info
= "赵六 后端工程师";
console
.log(info
.name
);
console
.log(info
.position
);
9:原型
1)所有 JavaScript 对象都从原型继承属性和方法。
function Person(first
, last
, age
, ) {
this.firstName
= first
;
this.lastName
= last
;
this.age
= age
;
}
var myFather
= new Person("Bill", "Gates", 62);
var myMother
= new Person("Steve", "Jobs", 56);
2)原型继承
所有 JavaScript 对象都从原型继承属性和方法。
日期对象继承自 Date.prototype。数组对象继承自 Array.prototype。Person 对象继承自 Person.prototype。
Object.prototype 位于原型继承链的顶端:
日期对象、数组对象和 Person 对象都继承自 Object.prototype。
3)向对象添加属性和方法
有时,您希望向所有给定类型的已有对象添加新属性(或方法)。
function Person(first
, last
, age
) {
this.firstName
= first
;
this.lastName
= last
;
this.age
= age
;
}
var person1
= new Person("张","三",19);
console
.log(person1
._proto_
);
person1
.prototype
.nationality
= "English";
console
.log(person1
._proto_
);
console
.log(Object
.getPrototypeOg(person1
));
4)使用 prototype 属性
JavaScript prototype 属性允许您为构造函数添加新属性:
function Person(first
, last
, age
) {
this.firstName
= first
;
this.lastName
= last
;
this.age
= age
;
}
Person
.prototype
.nationality
= "English";
JavaScript prototype 属性也允许您为构造函数添加新方法:
function Person(first
, last
, age
) {
this.firstName
= first
;
this.lastName
= last
;
this.age
= age
;
}
Person
.prototype
.name = function() {
return this.firstName
+ " " + this.lastName
;
};
10:Object.create 让一个对象继承另一个对象的所有属性,并且可以拥有直接的新的属性
function Person(first
, last
, age
) {
this.firstName
= first
;
this.lastName
= last
;
this.age
= age
;
}
var person1
= new Person("张","三",20)
var son
= Object
.create(person1
)
for(key
in son
){
console
.log(key
);
}
son
.first
="李";
son
.last
="四"
console
.log(son
);
获取一个对象里面他自己拥有的属性用 Object.getOwnPropertyNames() 方法
console
.log(Object
.getOwnPropertyNames(son
));
11:原型链( Object.getPrototypeOf() )
1)每个对象的原型,都还会有一个上层的原型,直到遇到null。这种链式继承下来的原型就构成了原型链
2)javascript里面最顶层的对象是Object
var protoOfSon
= Object
.getPrototypeOf(son
);
console
.log(protoOfSon
);
var protoOfSon1
= Object
.getPrototypeOf(protoOfSon
);
console
.log(protoOfSon1
);
var protoOfSon2
= Object
.getPrototypeOf(protoOfSon1
);
console
.log(pertoOfSon2
);
var protoOfObj
= Object
.getPrototypeOf(protoOfSon2
);
console
.log(protoOfObj
);
console
.log(Object
.getPrototypeOf(Object
.prototype
));
12:修改原型指向,改变继承关系
function Mansger(){
}
Manager
.prototype
.sex
= "男";
Object
.setprototypeOf(protoOfSonr
,Manager
.prototype
);
console
.log(protoOfSon
.sex
);
console
.log(Object
.PorotypeOf(protoOfSon
));
13:spread操作符( . . .对象名或者数组名) 把对象的属性或者数组的元素进行分离拓展为单个,与rest操作符相反
var post
= {
name
:"z",
age
:20
};
console
.log(post
);
var postClone
= {...post
};
console
.log(postClone
);
console
.log(post
=== postClone
);
1)添加新的属性
var post1
= {
...post
,
sex
:"男"
};
console
.log(post1
);
2)创建一个有额外元素的新数组
var arr
= [1,2,3];
var arrClone
= [...arr
];
console
.log(arrClone
);
var arr3
= [...arr
,4,5,6];
console
.log(arr3
);
3)在函数里面,如果一个函数接收多个参数,也可以通过数组spread传入参数
function savePost(id
,title
,content
){
console
.log(id
,title
,content
);
};
savePost(...[2,"标题","内容"])
14:Destructuring解构操作符 & rest操作符
1)destructuring解构
var post
= {
name
:"z",
age
:20,
sex
:"男",
numNull
:null
};
var { name
,age
} = post
;
console
.log(name
,age
);
(1)改变属性名
var { name
,age
:num
} = post
;
console
.log(name
,num
);
(2)定义默认值,防止对象没有这个属性或者他的值为undefined
var { name
,age
,num
=18 } = post
;
console
.log(num
);
(3)null不会被符默认值,null本身就是值
var { name
,numNull
="nums"} = post
;
console
.log(numNull
);
(4)数组解构赋值也可以有默认值
var [ a
,b
=2 ] = [1];
console
.log(a
,b
);
(5)结合数组和对象的解构赋值可以解构复杂的对象结构
var post2
= {
id
: 2,
title
: "标题2",
content
: "内容",
comments
: [
{ userId
:1 , comment
:"评论1"},
{ userId
:2 , comment
:"评论2"},
{ userId
:3 , comment
:"评论3"}
]
};
var { comments
:[ , {comment
} ] } = post2
;
console
.log(comment
);
(6)解构的key值时一个变量
function getId(idKey
,obj
){
let { [idkey
]:id
} = obj
;
return id
;
};
console
.log( getId("userId",{ userId
:3 } ) );
2)rest操作符,与数组相同,把想要属性取出来后,剩余的当一个子对象返回回来
var {comments
, ...rest
} = post2
;
console
.log(rest
);
3)解构出来的和rest操作符取出来的也可以做函数的参数
function savePostObj( {id
,title
,content
,...rest
} ){
console
.log(id
,title
,content
);
console
.log(rest
);
};
savePostObj( {id
:1,title
:"标题1",content
:"内容",num
:20} );
15:值传递和引用传递
1)引用传递
(1)数组参数引用传递
function byReference(arr
){
arr
[0] = 5;
};
var array
= [1,2,3];
byReference(array
);
console
.log(array
);
(2)对象参数引用传递
function byReferenceObj(obj
){
obj
.title
= "标题2";
};
var post
= {
id
: 1,
title
: "标题"
};
byReferenceObj(post
);
console
.log(post
);
(3)字符串比较特殊,虽然他是按引用传递的,但他每次被赋值的时候,都是创建了一个新的String对象,旧的不会改变
function byReferenceStr(str
){
str
= "abc";
};
var textStr
= "text";
byReferenceStr(textStr
);
console
.log(textStr
);
2)值传递
function byValue(num
){
num
= 10;
console
.log(num
);
};
var textNum
= 1;
byValue(textNum
);
console
.log(textNum
);
16:call,apply,bind都能用来改变函数中this的指向
var emp
= {
id
: 1,
name
: "z",
};
1)这里面的this指向全局的window对象,里面没有name这个属性,所以没有输出结果
function printInfo
:{
console
.log("员工姓名:" + this.name
);
};
printInfo();
2)用call这个方法给他指向
var emp
= {
id
: 1,
name
: "z",
}
function printInfo
:{
console
.log("员工姓名:" + this.name
);
};
printInfo
.call(emp
);
(1)加上额外的参数
var emp
= {
id
: 1,
name
: "z",
}
function printInfo(dep1
,dep2
,dep3
):{
console
.log("员工姓名:" + this.name
,dep1
,dep2
,dep3
);
};
printInfo
.call(emp
,"a","b","c");
3)使用apply可以直接把这些参数通过一个数组传递进去
printInfo
.apply(emp
,["a","b","c"]);
4)bind的操作跟call是一样需要传递参数列表,与call不同的是,bind是返回了改变的this之后的新函数,用于在后面去调用,不会立即执行
var emp
= {
id
: 1,
name
: "z",
}
function printInfo(dep1
,dep2
,dep3
):{
console
.log("员工姓名:" + this.name
,dep1
,dep2
,dep3
);
};
printInfo
.bind(emp
,["a","b","c"]);
需要将他赋值给一个变量,然后调用这个变量就会出现结果
var empPrintInfo
= printInfo
.bind(emp
,["a","b","c"]);
empPrintInfo();