Javascript之对象(一)

8 篇文章 2 订阅
2 篇文章 0 订阅

(一)对象

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨非墨Lg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值