(一)对象
1.对象的概念
对象是由属性和方法组成的,使用点语法访问
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词
-
对象与其他基本数据类型的区别
-
JS中的变量都是保存到栈内存中的,
-
基本数据类型的值直接在栈内存中存储,值与值之间是独立存在,修改一个变量不会影响其他的变量
-
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响
-
-
方法与函数
-
非对象中的称为函数,对象中的称为方法
-
函数的用法是函数名+(),方法是对象.方法名().
-
2.创建对象
- 利用字面量
花括号{}里面包含了表达这个具体事物(对象)的属性和方法。
//定义
var obj ={
//属性
uname:"墨非墨",
//方法
run:function() {
}
}
//调用
//对象.属性名
obj.name
//对象["属性名"]
obj["name"]
//两者之间的区别:(面试题)
//1.都是获取对象属性值的方法
//2.前者如果对象的属性名是数字时,则不可用,后者的使用范围更广,属性名是数字时,则只能用中括号来访问
//调用方法
//对象.方法()
obj.run()
注:
(1)里面的属性或者方法我们采取键值对的形式键属性名:值属性值
(2)多个属性或者方法中间用逗号隔开的
(3)方法冒号后面跟的是一个匿名函粉
- new Object
//语法
var obj = new Object();
//属性
obj.unaem = "";
//方法
obj.run = function(){
}
- 构建函数
//语法
/*
function 函数名(){
this.属性 = 值;
this.方法 = function(){
console.log(this.属性)
}
}
//调用
new 函数名();
*/
//例子
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
//方法
this.sayName = function(){
alert(this.name)
}
}
/*
创建一个Person构造函数
-在Person构造函数中,为每一个对象都添加了一个sayName方法,
目前我们的方法是在构造函数内部创建的,
也就是构造函数每执行一次就会创建一个新的sayName方法也是所有实例的sayName都是唯一的。
这样就导致了构造函数执行一次就会创建一个新的方法,
执行10000次就会创建10000个新的方法,而10000个方法都是一摸一样的这是完全没有必要,完全可以使所有的对象共享同一个方法
*/
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
//使用prototype属性,为所有对象创建公共的属性
Person.prototype.count = 0;
//方法
//使用prototype属性,为所有对象创建公共的方法
Person.prototype.sayName = function(){
alert(this.name);
}
//返回对象的格式
Person.prototype.toString = function(){
return "";
}
}
var per =new Person("林黛玉",18,"女");
per.sayName()
/*
构造函数new的执行流程:
1.立刻创建一个新的对象
2.将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回
*/
// new构造函数名();
function star(uname, age, sex){
this.name = uname;
this.age = age;this.sex = sex;
}
var ldh = new star('刘德华',18,"男");
console.log(ldh.name);
// 1.构造函数名字首字母要大写
//2.我们构造函数不需要return就可以返回结果
//new关键字执行过程
//1. new构造函数可以在内存中创建了一个空的对象
//2. this就会指向刚才创建的空对象
//3.执行构造函数里面的代码给这个空对象添加属性和方法
注:
构造函数与普通函数的区别在于调用方式不同,普通函数是直接调用,构造函数使用new关键字来调用
this的指向:
全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window )
方法调用中谁调用this指向谁
构造函数中this指向构造函数的实例 this指向的是 实例对象
实例成员就是构造函数内部通过this添加的成员uname age sing就是实例成员实例成员只能通过实例化的对象来访问
静态成员在构造函数本身上添加的成员sex就是静态成员 Star.sex =·男';
静态成员只能通过构造函数来访问
3. 原型对象
-
原型对象prototype
构造函数通过原型分配的函数是所有对象所共享的。
-
对象原型 __ proto __
对象都会有一个属性 _ proto _ 指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有proto原型的存在。
proto对象原型和原型对象prototype是等价的
-
constuctor 构造函数
对象原型(proto)和构造函数( prototype ) 原型对象里面都有一个属性constructor属性,constructor我们称为构造函数,因为它指回构造函数本身。
constructor主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。
///如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数 star.prototype = { constructor: star, //重新指向原来的构造函数。 sing: function() { console.1og(我会唱歌"); }, movie: function() { console.log('我会演电影'); } }
-
方法查找规则
首先先看1dh 对象身上是否有 sing方法,如果有就执行这个对象上的sing如果没有sing这个方法,因为有proto的存在,就去构造函数原型对象prototype身上去查找
-
原型链
- 扩展内置对象
可以通过原型对象,对原来的内置对象进行扩展自定义的方法。比如给数组增加自定义求偶数和的功能。
Array. prototype.sum = function( ) {
var sum = ;
for (var i = o; i < this.length; i++) {
sum += this[i];
}
return sum;
}
var arr =[1,2,3];
arr.sum()
4.遍历对象
for...in语句用于对数组或者对象的属性进行循环操作。
//语法
for (var index in obj){
console.log(index,obj[index])
}
5.对象方法
-
Object.keys()用于获取对象自身所有的属性,
类似for in ;
返回一个由属性名组成的数组
语法
Object.keys(obj)
-
Object.defineProperty()
定义新属性或 修改原有的属性
Object.defineProperty(obj,prop,descriptor)
obj:必须,目标对象
prop,必须,定义或修改的属性的名字
descriptor,必须,属性内容
-
Object.defineProperty()第三个参数descriptor说明∶以对象形式{}书写
value:设置属性的值默认为undefined
writable:值是否可以重写。true | false默认为false
enumerable:目标属性是否可以被枚举(遍历)。true| false默认为false
configurable:目标属性是否可以被删除或是否可以再次修改特性true | false默认为false
-