美文网首页
Javascript构造函数(一)概念,注意事项,defineP

Javascript构造函数(一)概念,注意事项,defineP

作者: 肆意咯咯咯 | 来源:发表于2018-04-01 11:15 被阅读0次

构造函数

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值丢失了,取而代之的是被返回的对象。

构造函数返回引用类型.png
结果.png

运行结果m的值和n的值是一样的,都是test函数返回的闭包,而this引用的对象和this.a=10的赋值结果全部被丢弃。

如果一个函数的返回值是一个值类型,那么这个函数作为构造函数用new运算符执行构造时,它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。

构造函数返回值类型.png 结果 (2).png

4.可以在构造函数中用object.defineProperty()方法实现初始化

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

语法

object.defineProperty(obj, prop, descriptor)

obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。

返回值

被传递给参数的对象

ES6

在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。

描述

该方法允许精确添加或修改对象的属性。通过赋值来添加的普通属性会创建在属性枚举期间显示的属性(for...inObject.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

当且仅当该属性的writabletrue时,value才能被赋值运算符改变。默认为 false

get

一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined

set

一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined

defineProperty初始化构造函数.png

1.如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。
2.如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。

如何实现一个自存档对象。 当设置temperature 属性时,archive 数组会获取日志条目。
Archiver

5.在构造函数中使用原型对象,也就是说构造函数内方法和原型对象的区别以及它们的优缺点,哈哈哈哈,下次再整理;啦啦啦啦!!!

怎么才能卖个萌!!!

噢,不行!讲个故事吧,
一天一个农夫牵了一头可爱的猪去市场,走到中途,猪不见了,怎么找都找不到,那么请问这头可爱的猪为什么找不到?

相关文章

  • Javascript构造函数(一)概念,注意事项,defineP

    构造函数 1.概念 在JavaScript中,任何合法的函数都可以作为对象的构造函数,既包含系统内置函数,也包括用...

  • ★04.关于委托构造函数

    简单示例 普通情况 继承中 注意事项 委托构造函数与继承中的继承构造函数非同一概念。

  • 04_JS面向对象

    知识点 传统构造函数存在的问题 使用原型解决构造函数问题 原型相关的概念 原型的使用 使用原型的注意事项 __pr...

  • javascript原型链

    javascript原型链:简单概念 简单讲解 这个prototype是定义构造函数构造出的每个对象的公共祖先 ...

  • 浅谈JavaScript构造函数

    提到“构造函数”,大部分人会联想到Java类的概念,JavaScript也有构造函数,其使用语法与Java或者其他...

  • JS之面向对象

    JavaScript是基于原型(prototype), 没有python中class 的概念。 构造函数在Java...

  • JavaScript 复习——原型链

    JavaScript 原型链中的主要知识概念:原型,构造函数,实例,proto,prototype,instanc...

  • JavaScript 原型链(一)

    JavaScript 原型链中的主要知识概念:原型,构造函数,实例,proto,prototype,instanc...

  • JS对象分类以及构造函数

    我们先引入一个概念,JavaScript中用new关键字来调用的函数是构造函数,它可以构造对象。 new操作符 n...

  • 构造函数和原型对象

    javascript使用构造函数和原型对象来进行面向对象编程 构造函数 在 JavaScript 中,构造器其实就...

网友评论

      本文标题:Javascript构造函数(一)概念,注意事项,defineP

      本文链接:https://www.haomeiwen.com/subject/mcuocftx.html