构造函数
1.概念
在JavaScript中,任何合法的函数都可以作为对象的构造函数,既包含系统内置函数,也包括用户自定义函数,构造函数就是用来创建对象时初始化对象,并且总与new运算符一起使用,每一个构造函数都有一个prototype属性,指向另一个对象,这个对象的所有属性和方法都会被构造函数的实例继承;
注意事项:
1.在命名规则上,构造函数一般是首字母大写,普通函数则是遵照小驼峰式命名法。
2.通常来说,构造函数没有返回值,它们只会初始化由this指针传递进来的对象,并且什么也不返回,new操作符会自动创建给定的类型并返回它们,当调用构造函数时,new会自动创建this对象,且类型为构造函数的类型,如果一个函数有返回值,被返回的对象就成new表达式的值。从形式上看,一个函数被作为构造函数还是普通函数执行的唯一区别,是否用new运算符。
function test(){
this.p = “I’m in constructed object”;
this.alertP = function(){
alert(this.p);
}
}
var o2 = new test();
那么通过new调用一个构造函数的时候到底发生了生么呢?
var obj ={};
obj.__proto__ = CO.prototype;
CO.call(obj);
return obj;
第一行,创建一个空对象obj。
第二行,将这个空对象的proto成员指向了构造函数对象的prototype成员对象,这是最关键的一步,具体细节将在下文描述。
第三行,将构造函数的作用域赋给新对象,因此CA函数中的this指向新对象obj,然后再调用CO函数。于是我们就给obj对象赋值了一个成员变量p,这个成员变量的值是” I’min constructed object”。
第四行,返回新对象obj。
3.构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。将构造函数返回值分为两种情况:引用类型和值类型
如果一个函数的返回值是引用类型(数组,对象或者函数)的数据,那么这个函数作为构造函数用new运算符执行构造时,运算的结果将被它的返回值取代,这时候,构造函数体内的this值丢失了,取而代之的是被返回的对象。
运行结果m的值和n的值是一样的,都是test函数返回的闭包,而this引用的对象和this.a=10的赋值结果全部被丢弃。
如果一个函数的返回值是一个值类型,那么这个函数作为构造函数用new运算符执行构造时,它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。
4.可以在构造函数中用object.defineProperty()方法实现初始化
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法
object.defineProperty(obj, prop, descriptor)
obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。
返回值
被传递给参数的对象
ES6
在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。
描述
该方法允许精确添加或修改对象的属性。通过赋值来添加的普通属性会创建在属性枚举期间显示的属性(for...in
或 Object.keys
方法), 这些值可以被改变,也可以被删除。这种方法允许这些额外的细节从默认值改变。默认情况下,使用Object.defineProperty()
添加的属性值是不可变的。
属性描述符
键值 | configurable | enumerable | value | writable | get | set |
---|---|---|---|---|---|---|
数据描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。
configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
enumerable
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined
。
writable
当且仅当该属性的writable
为true
时,value
才能被赋值运算符改变。默认为 false。
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined
。该方法返回值被用作属性值。默认为 undefined
。
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined
。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined
。
1.如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。
2.如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。
如何实现一个自存档对象。 当设置temperature 属性时,archive 数组会获取日志条目。
5.在构造函数中使用原型对象,也就是说构造函数内方法和原型对象的区别以及它们的优缺点,哈哈哈哈,下次再整理;啦啦啦啦!!!
怎么才能卖个萌!!!
噢,不行!讲个故事吧,
一天一个农夫牵了一头可爱的猪去市场,走到中途,猪不见了,怎么找都找不到,那么请问这头可爱的猪为什么找不到?