yui-object.js revision 458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4
4778ff543a041ac356d6e661cc9b66c3fafa2092Adam Moore/**
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * The YUI module contains the components required for building the YUI
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * seed file. This includes the script loading mechanism, a simple queue,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * and the core utilities for the library.
4778ff543a041ac356d6e661cc9b66c3fafa2092Adam Moore * @module yui
2c5ce90c334a2d0f18474e85c93b424b6ec9daaaAdam Moore * @submodule yui-base
4778ff543a041ac356d6e661cc9b66c3fafa2092Adam Moore */
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore/**
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * Adds the following Object utilities to the YUI instance
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @class Object
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore */
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore/**
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * Y.Object(o) returns a new object based upon the supplied object.
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method ()
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o the supplier object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {Object} the new object.
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore */
173310d032abe522e8645dd148cc28591cd128eaAdam Moorevar F = function() {},
173310d032abe522e8645dd148cc28591cd128eaAdam Moore
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// O = Object.create || function(o) {
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// F.prototype = o;
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// return new F();
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// },
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam MooreO = function(o) {
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore F.prototype = o;
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore return new F();
173310d032abe522e8645dd148cc28591cd128eaAdam Moore},
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
16bec62f211cecacdbbc2cb4632f079ef8c7f936Adam Mooreowns = function(o, k) {
c7eb563867fa29409073f3b495a067d9afa00006Adam Moore return o && o.hasOwnProperty && o.hasOwnProperty(k);
c74cf2305e301535acc8a5d42be60e93dcbd97daAdam Moore // return Object.prototype.hasOwnProperty.call(o, k);
16bec62f211cecacdbbc2cb4632f079ef8c7f936Adam Moore},
16bec62f211cecacdbbc2cb4632f079ef8c7f936Adam Moore
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam MooreUNDEF,
9fb523cf517ad4d6a53ae9f461d672cba63835d2Adam Moore
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore/**
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore * Extracts the keys, values, or size from an object
b39897a381c2203466da5568bfd2862a54a81311Adam Moore *
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore * @method _extract
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o the object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param what what to extract (0: keys, 1: values, 2: size).
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean|Array} the extracted info.
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @static
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore * @private
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore */
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore_extract = function(o, what) {
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore var count = (what === 2), out = (count) ? 0 : [], i;
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore for (i in o) {
489c0c8e2523f1bcd1acee1173c6d85f6a7edd6aAdam Moore if (owns(o, i)) {
4390434761f176b0f8d7a71c00a6e0141aa1752cAdam Moore if (count) {
4390434761f176b0f8d7a71c00a6e0141aa1752cAdam Moore out++;
4390434761f176b0f8d7a71c00a6e0141aa1752cAdam Moore } else {
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore out.push((what) ? o[i] : i);
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore }
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore }
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore }
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore return out;
91ff24e65531ce8bf171340d9384182f8c168af3Adam Moore};
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
173310d032abe522e8645dd148cc28591cd128eaAdam MooreY.Object = O;
173310d032abe522e8645dd148cc28591cd128eaAdam Moore
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore/**
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * Returns an array containing the object's keys
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method keys
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o an object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {string[]} the keys.
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore */
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// O.keys = Object.keys || function(o) {
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// return _extract(o);
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// };
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam MooreO.keys = function(o) {
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore return _extract(o);
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore};
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore/**
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * Returns an array containing the object's values
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method values
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o an object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {Array} the values.
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore */
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// O.values = Object.values || function(o) {
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// return _extract(o, 1);
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore// };
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam Moore
458ca79ae0e4fa1eb1a2a3c6f67401a191d025e4Adam MooreO.values = function(o) {
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore return _extract(o, 1);
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore};
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore/**
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * Returns the size of an object
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method size
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o an object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {int} the size.
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore */
13a50a8c4ecfe16d42abb7605f9451f76e02dc42Adam MooreO.size = Object.size || function(o) {
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore return _extract(o, 2);
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore};
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore/**
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * Returns true if the object contains a given key
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method hasKey
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o an object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param k the key to query.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean} true if the object contains the key.
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore */
16bec62f211cecacdbbc2cb4632f079ef8c7f936Adam MooreO.hasKey = owns;
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore/**
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * Returns true if the object contains a given value
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method hasValue
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o an object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param v the value to query.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean} true if the object contains the value.
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore */
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam MooreO.hasValue = function(o, v) {
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore return (Y.Array.indexOf(O.values(o), v) > -1);
d4dbc3afb5bb9cfd13490b358dc37bf951104ca7Adam Moore};
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore/**
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * Determines whether or not the property was added
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * to the object instance. Returns false if the property is not present
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * in the object, or was inherited from the prototype.
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore *
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method owns
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o {any} The object being testing.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param p {string} the property to look for.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean} true if the object has the property on the instance.
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore */
16bec62f211cecacdbbc2cb4632f079ef8c7f936Adam MooreO.owns = owns;
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore/**
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * Executes a function on each item. The function
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * receives the value, the key, and the object
2e3359c809b56e9d1c663465eaf85d1a4c03bf4cAdam Moore * as parameters (in that order).
87d6b0a14cce52c4faa4b78fc9878eb553dab0d5Adam Moore * @method each
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o the object to iterate.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param f {Function} the function to execute on each item. The function
efa57736d44cf446f1661497a8645bd388b493fbAdam Moore * receives three arguments: the value, the the key, the full object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param c the execution context.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param proto {boolean} include proto.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {YUI} the YUI instance.
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore */
b39897a381c2203466da5568bfd2862a54a81311Adam MooreO.each = function(o, f, c, proto) {
ba2701ee03e94104edf19911ee0989f8cee11088Adam Moore var s = c || Y, i;
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore
ba2701ee03e94104edf19911ee0989f8cee11088Adam Moore for (i in o) {
489c0c8e2523f1bcd1acee1173c6d85f6a7edd6aAdam Moore if (proto || owns(o, i)) {
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore f.call(s, o[i], i, o);
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore }
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore }
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore return Y;
1b298c6f0ef597aa4ab0b8bcb25430b6c9a87749Adam Moore};
c4e6d94ea429e473a6732b6eb5e0fc980e822881Adam Moore
7cd8fe832d4f91bed468c7498ff957c446f90aaaAdam Moore/**
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * Executes a function on each item, but halts if the
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * function returns true. The function
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * receives the value, the key, and the object
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * as paramters (in that order).
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * @method some
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o the object to iterate.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param f {Function} the function to execute on each item. The function
23209f57fce338501bc1dc828a991d103732b92fAdam Moore * receives three arguments: the value, the the key, the full object.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param c the execution context.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param proto {boolean} include proto.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean} true if any execution of the function returns true,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * false otherwise.
23209f57fce338501bc1dc828a991d103732b92fAdam Moore */
b39897a381c2203466da5568bfd2862a54a81311Adam MooreO.some = function(o, f, c, proto) {
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore var s = c || Y, i;
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore for (i in o) {
489c0c8e2523f1bcd1acee1173c6d85f6a7edd6aAdam Moore if (proto || owns(o, i)) {
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore if (f.call(s, o[i], i, o)) {
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore return true;
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore }
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore }
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore }
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore return false;
e0a1d83ad86620d8fd4e2bfa3c4ec5c0944a002aAdam Moore};
23209f57fce338501bc1dc828a991d103732b92fAdam Moore
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore/**
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * Retrieves the sub value at the provided path,
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * from the value object provided.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore *
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @method getValue
02b581ebfa9969c32cac8cd44ebe35e0e47f00ceAdam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @param o The object from which to extract the property value.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @param path {Array} A path array, specifying the object traversal path
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * from which to obtain the sub value.
0dca577a07715960da42d47787eecc25b285182fAdam Moore * @return {Any} The value stored in the path, undefined if not found,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * undefined if the source is not an object. Returns the source object
0dca577a07715960da42d47787eecc25b285182fAdam Moore * if an empty path is provided.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore */
b39897a381c2203466da5568bfd2862a54a81311Adam MooreO.getValue = function(o, path) {
0dca577a07715960da42d47787eecc25b285182fAdam Moore if (!Y.Lang.isObject(o)) {
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam Moore return UNDEF;
0dca577a07715960da42d47787eecc25b285182fAdam Moore }
0dca577a07715960da42d47787eecc25b285182fAdam Moore
b9f576e4a859f38cf945d867cf23fdbb84347564Adam Moore var i,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore p = Y.Array(path),
b9f576e4a859f38cf945d867cf23fdbb84347564Adam Moore l = p.length;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam Moore for (i = 0; o !== UNDEF && i < l; i++) {
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore o = o[p[i]];
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore }
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore return o;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore};
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore/**
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * Sets the sub-attribute value at the provided path on the
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * value object. Returns the modified value object, or
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * undefined if the path is invalid.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore *
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @method setValue
02b581ebfa9969c32cac8cd44ebe35e0e47f00ceAdam Moore * @static
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @param o The object on which to set the sub value.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @param path {Array} A path array, specifying the object traversal path
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * at which to set the sub value.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * @param val {Any} The new value for the sub-attribute.
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {Object} The modified object, with the new sub value set, or
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore * undefined, if the path was invalid.
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore */
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam MooreO.setValue = function(o, path, val) {
b39897a381c2203466da5568bfd2862a54a81311Adam Moore var i,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore p = Y.Array(path),
b39897a381c2203466da5568bfd2862a54a81311Adam Moore leafIdx = p.length - 1,
b39897a381c2203466da5568bfd2862a54a81311Adam Moore ref = o;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore if (leafIdx >= 0) {
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam Moore for (i = 0; ref !== UNDEF && i < leafIdx; i++) {
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore ref = ref[p[i]];
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore }
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam Moore if (ref !== UNDEF) {
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore ref[p[i]] = val;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore } else {
0bc189b2acbd7c4b5af63eded0c4289e224676b7Adam Moore return UNDEF;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore }
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore }
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore return o;
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore};
3395e5fc071521d4e6b258ef4c7c0ef38601b94eAdam Moore
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore/**
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore * Returns true if the object has no properties of its own
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore * @method isEmpty
02b581ebfa9969c32cac8cd44ebe35e0e47f00ceAdam Moore * @static
b39897a381c2203466da5568bfd2862a54a81311Adam Moore * @return {boolean} true if the object is empty.
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore * @since 3.2.0
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore */
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam MooreO.isEmpty = function(o) {
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore for (var i in o) {
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore if (owns(o, i)) {
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore return false;
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore }
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore }
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore return true;
8c3fae1cf2a8dfa82c53922a6f99ab7b991b959cAdam Moore};