谈谈我对javaScript里prototype的看法

javaScript创建每一个函数fn时,都会有一个ptototype属性,这个prototype其实就是一个指针,而这个指针总指向一

个原型对象,这个原型对象的用途就是将特定的属性或者方法包含在自己内部,从而实现了一个所有实例共享的作用。

什么?你还不明白,好吧!我简单来给你解释下吧,在解惑时,我得先让你跟着我的思路理一下。不然你会不知道我

在说什么了。

万物皆对象,好色如狼的我很自然地把女孩当成一个对象即javaScript里的一个Function,说白了就是我把女孩这比喻

成javaSript的一个函数。而我呢。则意淫成是她的男朋友,(哈哈,开玩笑,我这样的人是没有女朋友的),暂时抛开尘观念

且为了简单化。我将做爱这行为定义成一个函数。代码如下:

//定义一个空的函数(女孩)
function Mm(name,age){
this.name=name;
this.age=age;
this.Sex=SexWithBoy;//调用外部性行为这方法
};
//定义一个空的函数(男孩)
function Gg(name,age){
this.name=name;
this.age=age;
this.Sex=SexWithBoy;//正常调用外部性行为这方法(现实中,这也是可以的。)
};
//性行为
function SexWithBoy(){
console.info(‘You can have Sex with me.‘);
};
//实例化对象
var mm=new Mm(‘pertty‘,22);  //实例出一个名字叫‘pertty’,年龄为22岁的女孩出来
//通过实例对象mm可调用她的属性与方法行为,如
console.info(mm.name);  // pertty
console.info(mm.age);// 22
mm.Sex();// you can have sex with me.
//实例化对象
var gg=new Gg(‘handsome‘,23);//实例出一个名字叫‘handsome’,年龄为23岁的男孩出来
//通过实例对象mm可调用他的属性与方法行为,如
console.info(gg.name); // handsome
console.info(gg.age);// 23
mm.Sex();// you can have sex with me.

你看到了吗?实例化出来的那个男孩居然也可以成功地执行了SexWithBoy这方法,是不是觉得好可怕啊!男孩与男

孩居然也可以做爱了,虽说,现实是可以的。不过,还是挺让妹子们难过的。刚才开始我对于这现象至少是麻木觉得与

已不相关的。甚至来说,我是开心的。毕竟,在追寻女朋友的道路上,我又少了两个对手。可真正让我面对着妹子们那

双伤心的眼神时,我于心不忍。我只好哄她们开心。于是,我教她们这样做,将可以与男孩做爱这一行为只绑定到女孩

这函数的原型里,这样,SexWithBoy这方法只能在妹子们间可以调用。而男孩们就不会再拥有调用SexWithBoy这方法的

权限了。代码根据上面的稍作修改就可实现此需求,具体如下:

// 定义一个空的函数(女孩)
function Mm(name,age){
this.name=name;
this.age=age;
// this.Sex=SexWithBoy();//调用外部性行为这方法
};
// 在女孩的原型上,自定义私有属性与行为
Mm.prototype={
// 切记,这里一定要记住了。如果这里忘记写了,女孩的心又会跑到国民老公那里去了(注意:
// 如果少写这部分的话,代码运行起来,它的作用域总是会指向Object,而不是自己本身。)
// constructor:Mm,
constructor:Mm, // 指向当前自己本身
// 这样编写就可以将SexWithBoy这方法绑定到女孩的原型上了,
SexWithBoy:function(){
console.info(‘You can have Sex with me.‘);
}
};
// 定义一个空的函数(男孩)
function Gg(name,age){
this.name=name;
this.age=age;
//this.SexWithBoy=SexWithBoy;// 此次调用外部性行为这方法将会出现未定义此方法的错误(// 现实中,这也是可以的。)
};
// 性行为
// function SexWithBoy(){
// console.info(‘You can have Sex with me.‘);
// };
// 实例化女孩pertty对象
var mm=new Mm(‘pertty‘,22);  // 实例出一个名字叫‘pertty’,年龄为22岁的女孩出来
// 通过实例对象mm可调用她的属性与方法行为,如
console.info(mm.name);  // pertty
console.info(mm.age);// 22
mm.SexWithBoy();// you can have sex with me.
// 实例化女孩pertty2对象
var mm2=new Mm(‘pertty‘,20);  // 实例出一个名字叫‘pertty2’,年龄为22岁的女孩出来
// 通过实例对象mm可调用她的属性与方法行为,如
console.info(mm2.name);  // pertty2
console.info(mm2.age);// 20
mm2.SexWithBoy();// you can have sex with me.
// 实例化对象
var gg=new Gg(‘handsome‘,23);// 实例出一个名字叫‘handsome’,年龄为23岁的男孩出来
// 通过实例对象mm可调用他的属性与方法行为,如
console.info(gg.name); // handsome
console.info(gg.age);// 23
gg.SexWithBoy();// TypeError: gg.SexWithBoy is not a function

看到了吗?这次将SexWithBoy这方法绑定到了女孩(Mm)这原型上,就只有女孩这对象可以分享与男孩做爱的快乐了,而男孩想调用此方法时,立马给抛出gg.SexWithBoy is not a function 这种错误。好了,这样将方法绑定到固有的对象的原型对象上,就可以实现所有实例的共享的作用了。而对于其它外部的对象实例并不可使用!

这就我的javaScript的原型prototype解说。懂了吗?。我这种一脑袋色情的人来讲,觉得这解释是可以让我接受理解的。因此,为了更好地去消化它,我不得不以色情的事物对号入座来帮我更好地理解这prototype。好色并不是我的错,错的是我用色情眼光来看待一些事物上。只要用到对的地方上去,就会有它的价值了。好了,废话不多讲。希望,你可以明白!这原型的作用范围域就OK啦!

这样简单的在原基础上作了修改,我就又将再次地看到了妹子们脸上的笑容是那么的可爱。我本以为妹子们就会因此而爱上了我!不过,我发现我错了,她们还是选择了别人,我心好累!不过,我相信,总是会找到一个就是喜欢我这么好色的狼的女孩!我一直在期待着她的到来!

PS:代码其实还有可优化的地方,但主要是为了简单起见。就不再细谈了。关于javaScript继承与接口,设计模式等等,后期我会陆续不定时分享个人的见解的。

时间: 2024-11-10 08:10:27

谈谈我对javaScript里prototype的看法的相关文章

javascript继承—prototype属性介绍(2)

js里每一个function都有一个prototype属性,而每一个实例都有constructor属性,并且每一个function的prototype都有一个constructor属性,这个属性会指向自身.这会形成一个非常有意思的链式结构.举例如下: function Person(){ this.name =12; } console.log(Person.prototype); console.log(Person.prototype.constructor);//输出Person,指向自身

javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) - jssl915

一.利用空函数实现继承 参考了文章javascript继承-prototype属性介绍(2) 中叶小钗的评论指点,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权属性和特权方法,私有属性,私有方法的空耗资源问题. function Person(name,age){ this.name = name; this.age = age; } Person.prototype = { constructor:Person, sayHi:function(){

JavaScript里call,apply,bind方法简介

JavaScript里call,apply,bind方法不太容易理解,其实背后的思想并不算非常复杂,希望本文能帮你更好地了解这3个很像,而且看似很神秘的方法. 非要用一个关键字来点明它们的背后思想的精髓的话,关键字就是:this 因为通常程序员对C++比较熟,先借用C++,简单说一下this. 类的成员函数里,都可以用this来访问当前类的成员,但问题是成员函数的参数并没有this这个参数,比如: Animal a; a.eat(); a.eat("meat"); Animal的对象调

javascript里的继承

js里面继承的方式, 1. 类式继承,通过构造函数的继承 1 function extend(subClass, superClass){ 2 var F = function(){}; 3 F.prototype = superClass.prototype; 4 subClass.prototype = new F(); 5 subClass.prototype.constructor = subClass; 6 7 subClass.superclass = superClass.prot

JavaScript里的循环方法:forEach,for-in,for-of

JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) {  console.log(myArray[index]); } 自从JavaScript5起,我们开始可以使用内置的forEach方法: myArray.forEach(function (value) {  console.log(value); }); 写法简单了许多,但也有短处:你不能中断循环

JavaScript里的循环方法之forEach,for-in,for-of

JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) { console.log(m

在 JavaScript 中 prototype 和 __proto__ 有什么区别

本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的地方,就是 prototype 和 __proto__ 到底是干嘛的 1. __proto__ 就是 Javascript中 所谓的原型 (这里,我们还是拿具体的例子来说明吧) function A (name) { // 这里是一个构造函数 thia.name = name } var Aobj

JavaScript里关于声明的一些重要概念

所有的全局变量都是window的属性,在函数体外定义的var a=1等价于window.a=1: 所有的变量声明都在范围作用域的顶部,因为JS引擎首先会扫描所有的变量声明,然后将这些声明移动到顶部: 变量声明被提前了,变量赋值却没有.当变量声明和变量赋值一起使用时,JS引擎会自动将它分为两部分,以便将变量声明提前,不将赋值提前是因为可能影响代码执行出不可预期的结果: 函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样.但函数表达式不会提前,相当于变量赋值: 函数声

javascript里for循环的一些事情

今天在给一个学妹调她的代码BUG时,她的问题就是在一个for循环里不清楚流程的具体流向,所以导致了页面怎么调都是有问题,嗯确实你如果不清楚语句流向很轻易就会出问题,所以说for循环不会用或者说用的不恰当还是很可怕的.我也借此机会顺带复习了一下javascript里的for()循环.翻出了自己以前关于for循环的一些笔记,有些内容跃然浮于脑海中,以下大部分来自很久之前的笔记,可能会有一部分来自于网上其他优秀博客的内容. for循环里共有三个流程语句,这三个部分之间用";"分开.第一个是一