js|JavaScrit构造函数、原型对象作用意义
构造函数 构造函数就是一个普通函数,创建方式和普通函数没有区别,构造函数和普通函数区别就是调用方式不同,普通函数直接调用,而构造和函数需要使用new关键字来调用。
构造函数执行的流程:
1.立刻创建一个新的对象
2.将新建的对象作为函数中的this 在构造函数中可以使用this来引用新建的对象
3.逐行执行函数中的代码
4.将新建对象作为返回值返回
如下例子
function Person(name,age,gender){this.name = name;
// this指向新创建的对象per
this.age = age;
this.gender = gender;
this.sayName = function(){alert(this.name);
};
};
var per = new Person('孙悟空',19,'男');
// 使用new关键字调用构造函数
var per2 = new Person('白骨精',20,'女');
var per3 = new Person('奔波霸',22,'女');
console.log(per);
console.log(per2);
console.log(per3);
instanceof关键字
使用instanceof可以检查一个对象是否是一个类的实例
console.log(对象 instanceof 构造函数)//true
为什么要用原型对象? 先看下面的代码
function Person(name,age,gender){this.name = name;
// this指向per
this.age = age;
this.gender = gender;
this.sayName = function(){alert(this.name);
};
};
var per = new Person('孙悟空',19,'男');
// 使用new关键字调用构造函数
var per2 = new Person('孙悟空',19,'男');
console.log(per.sayName === per2.sayName);
//false
可以发现实例per和实例per2的sayName方法并不相同,这是因为sayName方法是在构造函数内部创建的,构造函数每执行一次都会创建一个新的sayName方法,所有实例的sayName方法都是唯一的。
执行10000次就会创建 10000个新方法,而这 10000个新方法都是一摸一样的,这是完全没有必须的!!!完全可以使所有对象都共享一个方法!!!而这个对象就是原型对象!!!
原型对象 原型(prototype)
我们所创建的每一个构造函数,解析器都会向构造函数中添加一个属性prototype,这个属性对应一个对象,这个对象就是我们所谓的原型对象
注意:如果函数作为普通函数调用prototype没有任何作用。
原型对象就相当于一个公共区域,所有构造函数的实例都可以访问到这个区域内的属性和方法,我们可以将共有的内容统一设置到原型对象中,当我们访问对象的一个属性或方法,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找。做为构造函数的实例对象也有一个隐含属性__proto__,实例的这个属性也对应原型对象。
再看下面代码
function Person(){};
Person.prototype.a = 123;
// 向Person的原型中添加属性a
Person.prototype.sayHello = function(){
// 向Person的原型中添加方法
console.log('hello');
}
var p = new Person();
var p2 = new Person();
console.log(p.sayHello===p2.sayHello);
// true
console.log(p.__proto__ === Person.prototype);
// true
console.log(p2.__proto__ === Person.prototype);
// true
使用原型对象的好处
以后我们创建构造函数时,可以将这些原型对象共有的属性和方法 统一添加到构造函数的原型对象中,这样不用分别为每个对象添加,可以节省内存,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。
in关键字
使用in关键字检查对象中是否含有某个属性时,如果对象中没有但原型中有也会返回true,否则返回false。
function MyClass(){};
// 向MyClass的原型中添加一个name属性
MyClass.prototype.name = '我是原型中的名字';
var mc = new MyClass();
mc.age = 18;
console.log('name' in mc);
// true
console.log('name' in MyClass);
// true
console.log('age' in mc)// ture
console.log('age' in MyClass)// false
可以发现 name 属性作为原型对象的属性,实例虽然没有定义 name 属性,但仍然可以访问到 name 属性,而属性age不行,因为age不存在MyClass的原型对象里。
【js|JavaScrit构造函数、原型对象作用意义】也可以使用对象的 hasOwnProperty() 来检查对象自身中是否含有该属性
function MyClass(){}
// 向MyClass的原型中添加一个name属性
MyClass.prototype.name = '我是原型中的名字';
var mc = new MyClass();
mc.age = 18;
console.log(mc.name);
// 可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性
console.log(mc.hasOwnProperty('name'));
// true
console.log(mc.hasOwnProperty('age'));
// true
推荐阅读
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 概率论/统计学|随机变量 的 分布函数 与 概率密度函数 的区别
- vue组件中为何data必须是一个函数()
- iOS-Swift-map|iOS-Swift-map filter reduce、函数式编程
- R语言|R语言 函数
- 2018-05-30闭包和函数
- 函数的一些东西