前言:(1)变量及其值保存在栈内存中,变量独立存在,修改一个,另外一个不会进行改变。
(2)对象保存在堆内存之中,obj变量保存的是地址,指向堆内存,所以修改一个另外一个也会改变。
(3)let obj1=new Obiject();
let obj2=new Obiject();
哪怕其中包含的值一样,但是new就已经创建了新的空间,所以
obj1==obj2 返回的是false
(4)对象的分类:
(5)立即调用函数
没有函数名,直接调用
(function(){alter(‘is’);})()
也就是fun外部加一个括号,其后再加一个括号,里面函数如果设置有参数,传参及时最后括号内加入参数
1.引用
当一个对象变量被拷贝 —— 引用则被拷贝,而该对象并没有被复制
引用之后,两者指向同一地方,任意一个做出相关的数据修改,另外一个数据也修改
<script>
//let fruit=prompt('whhile fruit you want');
let user={
'+2':'二傻',
'+3':'三傻',
'+1':'大傻',
}
let user2=user;
user2['+2']='三傻';
//此时输出为三傻,也就意味着引用之后,两者指向同一位置
alert(user['+2']);
</script>
(1)对于对象来说,普通相等 == 和严格相等 === 是两个作用结果完全一样的运算符。
仅当两个对象为同一对象时,两者才相等。
上案例alter(user==user2);输出为true
2.要实现上述效果有如下方法:
(1)
<script>
//let fruit=prompt('whhile fruit you want');
let user={
name:'jim',
age:18,
};
let user2={};
for(let key in user)
{
user2[key]=user[key];
}
alert(user2.name);//jim
user2.name='pete';
alert(user2.name);//pete
alert(user.name);//jim
</script>
(2)
Object.assign(dest, [src1, src2, src3…])
dest:拷贝其余对象到自己内部的对象
srcn:其后的全是要被拷贝进去的对象
<script>
//let fruit=prompt('whhile fruit you want');
let user={
name:'jim',
};
let user2={age:18,};
Object.assign(user,user2);
alert(user.age);//能够成功显示18
</script>
进行简单的全体拷贝,简便上述for…in方法
<script>
//let fruit=prompt('whhile fruit you want');
let user={
name:'jim',
age:18,
};
//尤为重要
let user2=Object.assign({},user);
alert(user2.name);
</script>
3.对象之中的函数
<script>
//let fruit=prompt('whhile fruit you want');
let user={
sayhi(){
alert('hello');
}
}
user.sayhi();
</script>
还有:
<script>
//let fruit=prompt('whhile fruit you want');
let user={
};
function sayhi(){
alert('hello');
}
//注意sayhi后面没有括号
user.sayhi=sayhi;
user.sayhi();
//注意,第一行sayhi没有括号。后一个有括号
</script>
4.this
在 JavaScript 中,this 关键字与其他大多数编程语言中的不同。JavaScript 中的 this 可以用于任何函数。
<script>
//let fruit=prompt('whhile fruit you want');
let user={
name:'jhon',
sayhi(){
//此处可以使用user.name但是会出现一些毛病,推荐使用this
alert(this.name)
}
}
user.sayhi();
</script>
this运用:
<script>
let user={name:'sun',};
let user2={name:'pete',};
function sayName()
{
alert(this.name);
}
user.f=sayName;
user2.f=sayName;
user.f();
user2.f();
</script>
五:重用对象的创建(new)
构造函数要求如下:
(1)他们的命名以大写字母开头
(2)他们只能由’new’操作符来执行
即:任何函数都可以通过 new 来运行,它会执行上面的算法。“首字母大写”是一个共同的约定,以明确表示一个函数将被使用 new 来运行。
<script>
//注意首字母大写
function User(name){
this.name=name;
this.isAdmin=false;
//其中也可以设定函数方法
//但是出现问题,此处没有一个新对象的创建,就需要创建一个函数。
//可以采取全局函数的做法如下
//代码改为:this.sayName=fun;
this.sayName=function()
{
alter(this.name);
}
}
function fun()
{
alter(this.name);
}
let user=new User('jack');
alert(user.name);
</script>
注意:上述代码之中的备注,提示了采用全局函数的方法来减少每次对象创建之中的函数创建,但是全局函数往往很容易造成问题,别人进行相同定义的全局函数,就会进行覆盖,则上述则需要有一个原型对象
六:原型对象:
我们创建的每一个函数,解析器都会向函数之中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
在构造函数内,运用:
let mc=new Myclass()//Myclass为构造函数
调用其中的原型对象为:mc.proto
<script>
function User(name,age){
this.name=name;
this.age=age;
}
User.prototype.sayName=function()
{
alert(this.name);
}
let user=new User('jhon',18);
let user2=new User('pete',19);
user.sayName();
user2.sayName();
</script>
注意:如果检查对象之中是否还有某个属性用in,但是在原始模型之中的属性用In检查则是true,但是如果要检查自己拥有的而不是大家共有的,则需要采用以下代码之中的方法
<script>
function User(name,age){
this.name=name;
this.age=age;
}
User.prototype.like='apple';
let user=new User('jhon',18);
alert('like'in user);//true
alert(user.hasOwnProperty('like'));//false
</script>
六:Symbol
根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有字符串或 Symbol 这两种类型
(1)
“Symbol” 值表示唯一的标识符。
例如:let id=Symbol();//括号内可以加入描述,但是影响不大,如果两个都是相同描述也没有问题。
例如:let id=Symbol(‘id’); let id2=Symbol(‘id’);
(2)
js内有很多的支持字符串隐式转换,例如alter()
但是Symbol特殊,它不会被自动转换
let id=Symbol();
alter(id);//为显示错误,类型错误
如果想要显示Symbol则需要以下:
alter(id.toString())或者
alert(id.description);