js-构造函数&原型的方法

js-构造函数&原型的方法

构造函数

定义自己的构造函数
1         function Rectangle(w, h){
2             this.width  = w;
3             this.height = h;
4         }
// 然后我们可以通过构造函数创建对象
var rect1 = new Rectangle(20, 60);
 
使用构造函数的目的是为了方便我们创建多个拥有相同属性和方法的对象。
1.当我们使用 new 操作符调用函数时,函数内部会自动创建一个该类型的新对象
2.我们可以在函数内部通过 this 关键字访问新创建的对象
3.当函数调用结束时,新创建的对象会被自动返回到函数外部
 
原型
 1         // 定义自己的构造函数
 2         function Rectangle(w, h){
 3             this.width  = w;
 4             this.height = h;
 5             this.getArea = function(){
 6                 return this.width * this.height;
 7             }
 8         }
 9 
10         // 每一构造函数都有一个 prototype 属性,属性的值是一个 Object 类型的对象
11         // 我们可以通过 3 种方式获取 prototype 属性的值:
12 
13         // 1. 通过构造函数直接获取
14         console.log(Rectangle.prototype)
15 
16         // 2. 通过对象(构造函数的实例)__proto__ 属性获取,不建议使用这种方式
17         var rect1 = new Rectangle(20, 60);
18         console.log(rect1.__proto__)
19 
20         // 3. 使用 Object.getPrototypeOf() 方法获取
21         console.log(Object.getPrototypeOf(rect1))
获取 prototype 属性的值
1. 通过构造函数直接获取
2. 通过对象(构造函数的实例)__proto__ 属性获取,不建议使用这种方式
3. 使用 Object.getPrototypeOf() 方法获取


原型对象
 
怎样遍历出对象的属性名和属性值?

var obj1 = {

myName: '张俊娜',

age: 19,

gender: '女',

address: '郑州'

};

 

    for in 遍历出对象的属性名和属性值

for (var propertyName in obj1) {

console.log(propertyName +' :'+obj1[propertyName])

}

    使用 Object.keys() 获取对象中的所有属性名(键)

var Okey=Object.keys(obj1);

for (var i = 0; i < Okey.length; i++) {

console.log(Okey[i]+"==>"+obj1[Okey[i]])

}

 

对象的属性可以分成几种类型?

 

两类:

数据属性:数据属性一般用于储存数据值,

访问器属性:不包含数据值、多用于get/set操作

 

属性的特性有哪些,分别代表什么意思?

使用Object.getOwnPropertyDescriptor()获取属性的特征。

数据属性的特性:

是否可枚举(遍历)  enumerabletrue

是否可配置(删除)  configurabletrue

是否可写    writable:  true

属性值      value:  “XX

 

访问器属性特征:

是否可枚举(遍历)  enumerabletrue

是否可配置(删除)  configurabletrue

在读取属性时调用的函数       get

在写入属性时调用的函数       set

 

禁止扩展的对象、被封印的对象和被冻结的对象分别有哪些特点?

 

Object.isExtensible(obj);           判断此对象是否是可扩展的(可添加属性的)

Object.preventExtensions(obj);     使对象变得不可扩展,即永远不可添加新属性。

不能添加新属性

可以修改已有的属性

可以删除已有的属性

可以访问已有的属性

可以枚举已有的属性

 

 

Object.isSealed(obj);              判断对象是否为封印

Object.seal(obj);                     设置对象为封印

不能添加新属性(不可扩展)

不能删除已有属性

可以修改已有的属性

可以访问已有的属性

可以枚举已有的属性

 

 

Object.isFrozen(obj);              判断对象是否为冻结

Object.freeze(obj);                设置对象为冻结

不能添加新属性(不可扩展)

不能删除已有属性

不能修改已有的属性

可以访问已有的属性

可以枚举已有的属性

 

怎样判断对象中是否有某个属性?

 

( . )或者方括号( [ ] )

通过点或者方括号可以获取对象的属性值,如果对象上不存在该属性,则会返回undefined。当然,这里的不存在指的是对象自身和原型链上都不存在,如果原型链有该属性,则会返回原型链上的属性值。

这种方式很简单方便,局限性就是:不能用在x的属性值存在,但可能为 undefined的场景。

 

 in 运算符

如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。

这种方式的局限性就是无法区分自身和原型链上的属性,在只需要判断自身属性是否存在时,这种方式就不适用了。

 

hasOwnProperty()

可以看到,只有自身存在该属性时,才会返回true。适用于只判断自身属性的场景。

 当读取一个对象的属性时,JavaScript引擎是怎样查找该属性的?

当读取一个对象的属性时,JavaScript引擎首先在该对象的自有属性中查找属性名字。如果找到则返回。

如果自有属性中不包含该属性,则JavaScript会沿着原型对象链搜索原型对象中的属性。

如果找到则返回,否则返回undefined

 
 

猜你喜欢

转载自www.cnblogs.com/nannanxiaogege/p/10076128.html