例子:1.自定义函数名() 2.对象名.javascript自带函数名()
如:
例1
function sum1(a,b){return a+b;}
alert(sum1(2,3));//没看见有对象名
例2
var x = “abcd”;
alert(x.indexOf(“a”,0))//x是对象名
解释:例子1不需要使用 函数名前面有个“句号” 句号前面有“对象”名这种结构就可以执行
例子2则必须使用这种结构
问题:1.在例子2中 这个js自带函数和对象名的从属关系是什么?
2.在教程中看过实例。自定义对象内可以定义和这个对象相关的不同属性名
那么在例子2中的函数是否在这个对象内被定义了。
3. 函数是处理数据的。 如果问题2成立了。那么在例2中是不是对象还定义了这个函数处理的数据的种类?
4.是不是像x.indexOf(“a”,0)这种使用方法的函数必须跟随对象名?
5.对于图片对不对?
关于例子2的图片
对于例1做一些解释:
通过 var x = function() {} 或者 function x() {} 这种形式定义的函数不属于任何对象, 只可以在它所属的闭包范围内通过 x() 这种形式来执行.
全局对象(浏览器对象模型中是 Window 对象)所属的函数或属性可以省略全局对象名, 即 window.alert() 可以简写为 alert()
1.在例子2中 这个js自带函数和对象名的从属关系是什么?
indexOf 这个方法是在 String 的原型中被定义的, indexOf 只是被 string 对象所"继承".
2.在教程中看过实例。自定义对象内可以定义和这个对象相关的不同属性名。那么在例子2中的函数是否在这个对象内被定义了。
没有.
var x = "abcd" 这里 x 是一个 string 对象(即 typeof x == 'string'), 因此它继承了 String 的原型中定义的所有方法和属性(例中 indexOf 是在 String 的原型中定义的, 即 String.prototype.hasOwnProperty("indexOf")).
在 javascript 原型链继承模型中, 对象可以通过 "." 运算符调用它本身或者原型链中任一对象中定义的函数.
3. 函数是处理数据的。 如果问题2成立了。那么在例2中是不是对象还定义了这个函数处理的数据的种类?
没有. 另外, 问题2不成立.
javascript 是弱类型的脚本语言, 函数中的参数不必定义类型, 甚至不用确定个数.
4.是不是像x.indexOf(“a”,0)这种使用方法的函数必须跟随对象名?
不是的, 可以通过 Function.prototype.call 或者 Function.prototype.apply 来更改 函数中 this 的指向(可以认为是操作对象)
例如
var indexOf = String.prototype.indexOf;
indexOf.call(x, "a", 0);
indexOf.apply(x, [ "a", 0 ]);
5.对于图片对不对?
图片不完全正确.
参考下面的例子和图片
function Point(x, y) {
// Point 拥有 x 和 y 两个属性
this.x = x;
this.y = y;
}
Point.prototype = {
// Point 从它的原型中"继承"了 distanceFromOrgin 方法
distanceFromOrgin: function(p) {
return Math.sqrt((p.x - this.x) * (p.x - this.x) + (p.y - this.y) * (p.y - this.y));
}
};
// p1 诞生, 它拥有 Point 以及它的各级原型中定义的所有方法, 包括 Object 的原型中定义的 toString 方法
var p1 = new Point(3, -4);