mysql之call函数原型博客园_函数原型

1.可访问属性

var person={

name:"王瑞睿",

age:12

};

//访问器属性,访问器属性不包括数据值,但是包括getter与setter函数,setter is used to change the object`s property value

Object.defineProperty(person,"name",{

get:function(){

alert("sss");

},

set:function(newvalue){

if(newvalue=="object"){

this.age++;

}

}

})

Object.defineProperty(person,"sex",{

writable:false,

value:"man",

}) //数据成员得属性都包括可读性,可遍历性,可删除性和value,通过defineProperty()函数是指明对象的数据属性或者是访问器属性

person.name="object"; name为访问器属性

console.log(person.age);   13

console.log(person.sex);   man

person.sex="woman";

console.log(person.sex);  man(只读)

2.configurable

需要注意的是:对象的可删除性在被修改为false之后,对象的configurable就不能被修改,否则出错

Object.defineProperty(person,"height",{

//     writable:true,

//     configurable:false,

//     value:175,

// })

// Object.defineProperty(person,"height",{

//     configurable:true,  //error

//     value:175,

// })

//defineProperties()

3.defineProperties()

var students={

name:"jack",

}

Object.defineProperties(students,{

age:{

writable:true,

value:15

},

height:{

writable:true,

value:175

},

_age:{

get:function(){

console.log(this.age);

},

set:function(newvalue){

if(newvalue>=15){

this.height+=(newvalue-15)*5;

}

}

}

})

console.log(students.name);

students._age=19;

console.log(students.height); 195

4.getOwnPropertyDestriptor()返回一个数据类型的对象

Object.getOwnpropertyDesctriptor()

var age=Object.getOwnPropertyDescriptor(students,"age"); //数据类型

console.log(age.writable+" "+age.value+" "+age.configurable);

注意:getOwnPropertyDescriptor()只是用于实例属性,而不是用于原型属性,如果要查看原型的数据类型,必须直接调用原型

var _age=Object.getOwnPropertyDescriptor(students,"_age");//访问器类型

console.log(typeof _age.get);  function

5.构造函数

//工厂模式

function Students(fromwhere,ages,thename){

this.name=thename;

this.place=fromwhere;

this.age=ages;

}

Students.prototype.show=function(){

alert(this.name+this.age+"岁"+"住在"+this.place);

}

var stu1=new Students("shanxi",12,"王瑞睿");

每一个被实例化的对象都有一个constructor属性,指向构造函数。用来标识对象类型

console.log(stu1.constructor==Students);

object instanceof ObjectName 是一个检测对象类型的函数。

console.log(stu1 instanceof Object); true

console.log(stu1 instanceof Students);  true

构造函数本身是一个函数,在不用new来声明一个对象的时候 ,和普通函数是一样的,但是对象是window

Students("ss",13,"ss"); //对象指向window

console.log(window.place); //ss

//也可以通过call函数或者apply函数进行传参

//var o=new Object();

//Students.call(o,"ww",14,"ww");

//console.log(o.place);

6. 函数原型prototype

7911786.html

函数原型:prototype属性就是包含特定类型的所有实例共享的原型函数,本属性针对的是整类对象而不是针对某个对象,

每一个函数在创建时就会有一个prototype对象,成为原型对象,原型对象有一个属性constructor(指针)指向构造函数。

当调用构造函数实例化对象的时候,实例化对象被添加一个[[prototype]]属性,是一个指针,指向构造函数.prototype。

也就是说,实例化对象与构造函数的原型有关,而不和构造函数有关系!!!!

实例化对象调用属性或者方法是一个寻找的过程,从对象实例到原型依次寻找,当在对象实例中找到就返回,没找到才会去原型找,涉及一个"隐藏""遮盖"的概念

使用原型可以使所有实例的对象共享它(原型)所包含的属性和方法,类似于继承或者是static

function Students(fromwhere,ages,thename){

this.name=thename;

this.place=fromwhere;

this.age=ages;

}

Students.prototype.show=function(){

alert(this.name+this.age+"岁"+"住在"+this.place);

}

var stu1=new Students("shanxi",12,"王瑞睿");

var stu2=new Students("天津",13,"郑婉君");

console.log(stu1.show()==stu2.show());  true

console.log(Students.prototype.isPrototypeOf(stu2))   stu2是否与Students.prototype建立了某种联系

console.log(Object.getPrototypeOf(stu1)==Students.prototype);Object.getPrototypeOf(object)  获得一个与object所具有某种联系的原型

console.log(Object.getPrototypeOf(stu1).show);

当代码读取某个对象的某个属性的时候,都会执行一次搜索,先从对象实例开始,如果在实例中找到了值,则返回,就不用在向原型搜索,

当在实例中找不到时,才会向原型进行寻找,所以就会面临一个隐藏覆盖的问题,当原型的某个属性与实例中的属性重复时,原型的属性就被遮盖住了。

但是不管你怎么修改实例中的属性值,只是修改了实例中的值,而对于原型中重复的那个属性值而言毫无变化,但是你可以删除实例中的值,然后原型的值又”重见天日“

function Person(name,age,sex){

this.name=name;

this.sex=sex;

this.age=age;

}

Person.prototype.age=17; //对象是在对象外定义的,而不是对象内

var person=new Person("ss",19,"man");

//delete person.age;// 根据对象属性configurable,对属性进行删除。

console.log(person.age);  //19

7.hasOwnProperty()

//从Object继承来的hasOwnProperty() 是检测属性是在原型中还是在实例中,存在于实例时,返回true,存在于原型时,返回false

console.log(person.hasOwnProperty("age"));  //true

//原型与in操作符

//当in单独使用的时候 ,in可以判断某属性是否存在于某对象中,存在就返回true,而不管是不是原型或者实例中,

console.log("age" in person); //true

function hasporptotyperoperty(object,name){

return !object.hasOwnProperty(name)&&(name in object);

}  //判断属性是否在原型中。

//原型和 For-in

//使用for-in循环,可以返回所有可枚举的实例化属性和原型属性,并且包括屏蔽了原型中方法的实例化属性。但是在爱IE8之前存在问题。

//取得对象上所有可枚举的实例属性,可以通过ES5的Object.keys(),返回一个属性数组。接受一个对象作为参数。

//console.log(Object.keys(Person.prototype));  //获得Person对象的原型中所有的可枚举属性

//console.log(Object.getOwnPropertyNames(Person.prototype));//获得Person.prototype中所有的属性

//直接把prototype看作一个对象直接赋值,

8.原型重写:1.prototype.constructor的指向问题被更改,2.与最初的prototype的联系切断。

7911786.html

function animals(){

}

1.var pig=new animals(); //此时pig构造函数的[[ptototype]]指针指向的是最初原型,并且重写原型对象打断了之前与最初原型的联系。这是undefined的原因

但是 1、2 如果调换位置的话,构造函数与函数原型的联系就重新连接。

2.animals.prototype={

constructor:animals,

legnum:2,

headnum:4

}

console.log(pig.legnum); undefined

console.log(animals.prototype.constructor==animals); //true

但是需要注意的是,重写原型函数,原先的函数的prototype属性的constructor属性不再指向animal函数,而是指向Object,当然我们可以在原型对象中指定constructor的值。

9,原型的缺点

当原型中包含着包含引用类型值的时候,原型会因为个别对象的改变,而改变所有的对象属性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值