JavaScript构造函数、实例化对象以及属性总结(上)

/*
目的:
实现创建一列学生数据,每个学生调用一个方法,与人打招呼
* 学生信息
* name
* age
* sayHello
*
* */
 
 
构造函数的初始
 
//封装一个函数,根据不同的参数调用
function students(name, age) {
var obj = {}; //创建一个对象
obj.name = name;
obj.age = age;
obj.sayHello = function () {
    alert( obj.name + 'hello');
};
return obj; //返回创建的对象
}
 
var a = students('an',18);
a.sayHello();
 
var b = students('bn',18);
b.sayHello();
 
 
 这种封装的根本目的是把一组相同类似的写法进行抽离,汇总写一个共用的模板,使得这一组类似的对象调用;
 
 写法简练,易读还能提高性能和开发时间。而构造函数相当于一组对象的模板,对象是构造函数的实例。把上面的代码规范统一专业化,便是构造函数的写法形式。
 
 
 
 
function Student(name, age) {
this.name = name;
this.age = age;
this.sayHello = function () {
    alert(this.name + ' '+'Hello')
}
}
Student.prototype.loving = '工作';
 
var c = new Student('ccn', 20);
c.sayHello();
 
 
var d = new Student('dddd', 30);
d.sayHello();
 
 
prototype属性
 
每个构造函数都有prototype属性,同时prototype也是一个对象,即是实例化对象的原型
 
原型:一个对象A, 继承对象B,对象B称为对象A的原型,
 
此时,对象B改变 对象A对应的属性或方法也会改变,对象A改变则对象B则不会改变【正常写法的情况下】
 
 
 
__proto__
 
每个对象的__proto__属性 与 构造函数的prototype 指向同一个地方,所以一个修改了就会影响另一个
 
console.log(c.__proto__ === Student.prototype); //返回true
 
 
原型链
 
在prototype中提到了原型,原型链顾名思义就是把原型串联起来,是这样的,没错。
 
把构造函数的属性Student.prototype称为实例化对象的原型; 此时Student.prototype也是一个对
 
象, 其构造函数是Object,其原型是Object.prototype。 Student.prototype 、Object.prototype 就
 
构成了原型链,实例化对象在查找属性的时候是沿着原型链进行查找的,若是在Object.prototype中找不到才
 
返回undefined。
 
 
 
 
构造函数及实例对象相关的属性
 
constructor详解
 
注意,是实例化对象的属性,用来返回构造实例化对象的构造函数
 
// constructor属性,返回的是函数,创建该对象的构造函数
// 用于判断实例是否由该构造函数构造的
 
console.log(d.__proto__.constructor === Student); //true
 
 
instanceof详解
 
注意instanceof也可用于判断指定的实例化对象是否由指定的构造函数构造的,其本质和用constructor是不一样的
 
// instanceof 来检测某个对象是不是另一个对象的实例。a instanceof b 真正的语义是检查 b.prototype 是否在 a 的原型链上
console.log( d instanceof Student); //true
console.log( d instanceof Object); //true
console.log( d instanceof Object); //true
console.log( d instanceof Function); //false
 
具体使用那一个根据实际场景取舍。
 
 
hasOwnProperty() 详解
 
注意,这是针对实例化对象的。
 
//hasOwnProperty 返回实例化对象的构造函数的私有属性
 
for(var key in d){
   console.log( key );  }
 
不使用hasOwnProperty时输出
 
for(var key in d){
if( d.hasOwnProperty(key) ){
     console.log( key ); //
           }
}
使用hasOwnProperty时输出
 
Object.defineProperty()详解
 
注意,这是针对实例化对象的。
 
解决当修改其中的一个实例化对象的属性时,其它的实例化对象的属性不被影响的问题。因为同一个构造函数的实例化对象的原型是同一个。所以要避免这种问的发生。
 
//实例化对象的读写操作
 
//Object.defineProperty()设置和修改某个指定的实例化对象的属性
 
Object.defineProperty(d,'name',{ //默认的都是true
configurable:true, //能不能被删
writable:false, //能不能写入
enumerable:false, //能不能被forin枚举
value: '' //内容,如果允许被修改,则是写入的内容,不被修改则不需要设置这个属性
});
//delete d.name;
d.name = 12345;
console.log( d );
 
指定的属性存在,则默认值是true;
 
如果使用Object.defineProperty()这种方式添加新的属性,其参数的默认值都是false;
 
 
Object.defineProperties()
 
//Object.defineProperties()是Object.defineProperty()的复数形式,也就是可以设置多个属性
Object.defineProperties( c, {
sex:{
configurable:true,
value:12
},
code:{
configurable:false,
value:'javaScript'
},
_name:{
    get:function () {
 
},
    set:function () {
 
    }
}
});
 
console.log( c );

猜你喜欢

转载自www.cnblogs.com/wjh0916/p/9646084.html