对象
简单对象示例:
var person={
name:"a",
age:20,
1:2,
"a":"b"
};
当属性名为数字或字符串时,要使用 person["1"] 或 person["age"] 调用
console.log(person["1"]);
console.log(person["a"]);
console.log(person.name);
添加对象属性方法
person.family = "jia";
删除对象属性
delete person.family;
对象三特性(可配置性)(枚举性)(可写性)
Object.defineProperty(person,"name",{
(configurable(可配置性)指明该属性是否能被删除和修改,为true时被删,为false,不能被删)
configurable:true,
(enumerable(枚举性)指明该属性是否能在for/in中被返回,为true时,能返回,为false时,不能被返回)
enumerable:true,
(writable(可写性)为true是可修改,为false时,则不能被修改)
writable:true,
(为person的name属性添加值“abc”)
value:"abc"
});
(可配置性)(枚举性)(可写性)示例:
console.log(person.name);
(当configurable (可配置性)为true时可以被删除,为false,不能被删)
delete person.name;
console.log(person.name);
(枚举性)指明该属性是否能在for/in中被返回
返回值:1 name age
for(var x in person){
//返回的是属性
console.log(x);
//返回的是属性的值
console.log(person[x]);
}
(writable(可写性)为true是可修改,为false时,则不能被修改)
person.name = "aaa";
console.log(person.name);
对象的创建方式(JSON)1
var person1 = { //先声明再定义
name : "zhangsan",
age : 30,
SayName1 : function(){
console.log(this.name);
}
};
console.log(person1.name);
console.log(person1.age);
person1.SayName1();
对象的创建方式(JSON)2
var person2 = {}; //首先定义对象,再赋值
person2.name = "lishi";
person2.age = 29;
person2.SayName2 = function(){
console.log(this.name);
};
console.log(person2.name);
console.log(person2.age);
person2.SayName2();
对象的创建方式(return JSON)普通函数3
function getPerson(name,age){
相当于return JSON
return{
name : name ,
age : age,
SayName3 : function(){
console.log(this.name);
}
}
}
var person3= getPerson("zhangsan",49);
console.log(person3.name);
console.log(person3.age);
person3.SayName3();
对象的创建方式(return JSON)普通函数4
function getPerson1(name,age){
return{
}
}
var person4 = getPerson1("lishi",29);
person4.age = 29;
person4.name = "lishi";
person4.SayName4=function(){
console.log(this.name);
};
console.log(person4.name);
console.log(person4.age);
person4.SayName4();
对象的创建方式(return JSON)普通函数5
function getPerson2(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.SayName5 = function(){
console.log(this.name);
};
return obj;
}
var person5 = getPerson2("zhangsansan",1);
console.log(person5.name);
console.log(person5.age);
person5.SayName5();
对象的创建方式(return JSON)构造函数6
构造函数与普通函数区别:第一个字母大写,构造有隐式return。
function Person (name,age){
this.name = name;
this.age = age;
this.SayName6 = function(){
console.log(this.name);
}
}
var person6 = new Person("lishishi",44);
console.log(person6.name);
console.log(person6.age);
person6.SayName6();
# 原型 #
## 函数与对象的关系: ##
1 函数就是对象的一种,可以通过instanceof运算符判断;
**示例:**
function fn(){
console.log(fn instanceof Object); // true
}
2 对象是函数创建的
**示例 :**
var obj = new Object();
console.log(typeof Object); // function
**说明:** 对象是函数创建的,而函数却又是一种对象
## prototype原型(函数) ##
prototype是函数的一个属性,也就是说,每一个函数都有一个prototype的属性,而这个prototype的属性的值实际上是一个对象,这个对象默认只有一个constructor的属性,且指向这个函数本身.
![]()
**构造函数中的属性和原型中的属性的区别:**
1 把属性定义在原型中比定义在构造函数中消耗的内存更小,因为在内存中的一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在内存中再复制一份.因此,如果没有特殊原因,我们一般把属性写到类中,而行为写在原型中.
**说明:**使用原型的方式定义属性,实际上不同对象中的属性是共享的,也就是说,对其中任何一个对象修改了其中的属性值,其他对象的属性也会发生变化,因为他们共享的是同一个属性.
2 构造函数中定义的属性或方法要比在原型中定义的属性和方法的优先级高,如果定义了同名称的属性和方法,构造函数中的将会覆盖原型中的.
**隐式原型(对象)**
**隐式原型:** ___proto___是对象的一个属性,即每个对象都有一个___proto___属性,也称为隐式原型.
prototype与___proto___关系:他们的结果都是一样的,全等,即,每个对象都有一个___proto___属性,指向创建该对象的函数的prototype.
## 函数与对象的关系: ##
1 函数就是对象的一种,可以通过instanceof运算符判断;
**示例:**
function fn(){
console.log(fn instanceof Object); // true
}
2 对象是函数创建的
**示例 :**
var obj = new Object();
console.log(typeof Object); // function
**说明:** 对象是函数创建的,而函数却又是一种对象
## prototype原型(函数) ##
prototype是函数的一个属性,也就是说,每一个函数都有一个prototype的属性,而这个prototype的属性的值实际上是一个对象,这个对象默认只有一个constructor的属性,且指向这个函数本身.
**构造函数中的属性和原型中的属性的区别:**
1 把属性定义在原型中比定义在构造函数中消耗的内存更小,因为在内存中的一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在内存中再复制一份.因此,如果没有特殊原因,我们一般把属性写到类中,而行为写在原型中.
**说明:**使用原型的方式定义属性,实际上不同对象中的属性是共享的,也就是说,对其中任何一个对象修改了其中的属性值,其他对象的属性也会发生变化,因为他们共享的是同一个属性.
2 构造函数中定义的属性或方法要比在原型中定义的属性和方法的优先级高,如果定义了同名称的属性和方法,构造函数中的将会覆盖原型中的.
**隐式原型(对象)**
**隐式原型:** ___proto___是对象的一个属性,即每个对象都有一个___proto___属性,也称为隐式原型.
prototype与___proto___关系:他们的结果都是一样的,全等,即,每个对象都有一个___proto___属性,指向创建该对象的函数的prototype.