基于构造函数创建的自定义类

基于构造函数创建自定义类(constructor)

1.在普通函数执行的基础上“new xxx()”,这样就不是普通函数执行了,而是构造函数执行,当前的函数名称之为“类名”,接收的返回结果是当前类的一个实例
2.自己创建的类名,最好第一个单词首字母大写
3.这种构造函数设计模式执行,主要用于组件、类库、插件、框架等的封装,平时编写业务逻辑一般不这样处理

 Fn();//=>普通函数执行
var f = new Fn();//=>Fn是类 f是类的一个实例
var f2 = new Fn();//=>f2也是Fn的一个实例,f2和f是独立分开的,互不影响

JS中创建值有两种方式

  • 1.字面量表达式
  • 2.构造函数模式
    var obj = {};//=>字面量方式
    var obj = new Object();//=>构造函数模式
    不管是哪一种方式创造出来的都是Object类的实例,而实例之间是独立分开的,所以 var xxx={} 这种模式就是JS中的单例模式
基本数据类型基于两种不同的模式创建出来的值是不一样的
//> 基于字面量方式创建出来的值是基本类型值
//> 基于构造函数创建出来的值是引用类型
//->NUM2是数字类的实例,NUM1也是数字类的实例,它只是JS表达数字的方式之一,都可以使用数字类提供的属性和方法
// var num1 = 12;
// var num2 = new Number(12);
// console.log(typeof num1);//=>"number"
// console.log(typeof num2);//=>"object"

普通函数执行
/!

//1.形成一个私有的作用域
//2.形参赋值
//3.变量提升
//4.代码执行
//5.栈内存释放问题
Fn();
构造函数执行
var f1 = new Fn(‘xxx’, 20);
var f2 = new Fn(‘aaa’, 30);

console.log(f1 === f2);//=>false:两个不同的实例(两个不同的堆内存地址)
console.log(f1.age);//=>30
console.log(f2.name);//=>‘aaa’
console.log(“name” in f1);//=>true name&age在两个不同的实例都有存储,但是都是每个实例自己私有的属性
console.log(f1.n);//=>undefined 只有this.xxx=xxx的才和实例有关系,n是私有作用域中的一个私有变量而已(this是当前类的实例

*构造函数执行,不写RETURN,浏览器会默认返回创建的实例,但是如果我们自己写了RETURN?

  • 1.return是的一个基本值,返回的结果依然是类的实例,没有受到影响
  • 2.如果返回的是引用值,则会把默认返回的实例覆盖,此时接收到的结果就不在是当前类的实例了
  • 构造函数执行的时候,尽量减少RETURN的使用,防止覆盖实例
function Fn() {
   var n = 10;
   this.m = n;
   // return;//=>这样RETURN是结束代码执行的作用,并且不会覆盖返回的实例
   // console.log(1);
}

var f = new Fn();//=>new Fn;  在构造函数执行的时候,如果Fn不需要传递实参,我们可以省略小括号,意思还是创建实例(和加小括号没有区别)
console.log(f);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值